import random import networkx as nx import matplotlib.pyplot as plt
# バーンズリーのシダ生成関数 defbarnsley_fern(n): # 初期条件 x, y = 0, 0 points = [(x, y)] # バーンズリーのシダ生成 for _ inrange(n): r = random.random() if r <= 0.01: x, y = 0, 0.16 * y elif r <= 0.86: x, y = 0.85 * x + 0.04 * y, -0.04 * x + 0.85 * y + 1.6 elif r <= 0.93: x, y = 0.20 * x - 0.26 * y, 0.23 * x + 0.22 * y + 1.6 else: x, y = -0.15 * x + 0.28 * y, 0.26 * x + 0.24 * y + 0.44 points.append((x, y)) return points
# バーンズリーのシダを生成 fern_points = barnsley_fern(10000)
# グラフの作成 G = nx.Graph()
# ノードの追加 for i, (x, y) inenumerate(fern_points): G.add_node(i, pos=(x, y))
# エッジの追加 for i inrange(len(fern_points) - 1): G.add_edge(i, i+1)
# バーンズリーのシダ生成 for _ inrange(n): r = random.random() # 0から1の乱数を生成 if r <= 0.01: x, y = 0, 0.16 * y elif r <= 0.86: x, y = 0.85 * x + 0.04 * y, -0.04 * x + 0.85 * y + 1.6 elif r <= 0.93: x, y = 0.20 * x - 0.26 * y, 0.23 * x + 0.22 * y + 1.6 else: x, y = -0.15 * x + 0.28 * y, 0.26 * x + 0.24 * y + 0.44 points.append((x, y)) # 新しい座標をリストに追加
# 変数の定義 routes = [(i,j) for i in supply for j in demand] vars = pulp.LpVariable.dicts("Route", (supply, demand), lowBound=0, cat='Continuous')
# 目的関数 prob += pulp.lpSum([vars[i][j] * cost[i][j] for (i, j) in routes])
# 制約条件 # 各供給地から出る供給量がその供給地の供給量に等しい for i in supply: prob += pulp.lpSum([vars[i][j] for j in demand]) == supply[i]
# 各需要地に入る供給量がその需要地の需要量に等しい for j in demand: prob += pulp.lpSum([vars[i][j] for i in supply]) == demand[j]
# 最適化の実行 prob.solve()
# 結果の表示 print("Status:", pulp.LpStatus[prob.status]) print("Total Cost:", pulp.value(prob.objective)) for v in prob.variables(): print(v.name, "=", v.varValue)
routes = [(i,j) for i in supply for j in demand] vars = pulp.LpVariable.dicts("Route", (supply, demand), lowBound=0, cat='Continuous')
routes: 全ての供給地と需要地の組み合わせをリストにします。
vars: 各ルートにおける輸送量を表す変数を定義します。ここでは、連続変数として定義しています。
6. 目的関数の定義
1
prob += pulp.lpSum([vars[i][j] * cost[i][j] for (i, j) in routes])
目的関数は、全てのルートにおける輸送コストの総和を最小化することです。
7. 制約条件の定義
1 2 3 4 5 6 7
# 各供給地から出る供給量がその供給地の供給量に等しい for i in supply: prob += pulp.lpSum([vars[i][j] for j in demand]) == supply[i]
# 各需要地に入る供給量がその需要地の需要量に等しい for j in demand: prob += pulp.lpSum([vars[i][j] for i in supply]) == demand[j]
供給制約: 各供給地から出る供給量が、その供給地の供給量に等しくなるようにします。
需要制約: 各需要地に入る供給量が、その需要地の需要量に等しくなるようにします。
8. 最適化の実行
1
prob.solve()
Pulpのsolveメソッドを使用して、定義した問題を解きます。
9. 結果の表示
1 2 3 4
print("Status:", pulp.LpStatus[prob.status]) print("Total Cost:", pulp.value(prob.objective)) for v in prob.variables(): print(v.name, "=", v.varValue)
# 捕食チェック for prey in prey_list.copy(): if np.sqrt((prey.x - self.x)**2 + (prey.y - self.y)**2) < 1: prey_list.remove(prey)
# 初期化 preys = [Prey(np.random.uniform(0, world_size[0]), np.random.uniform(0, world_size[1])) for _ inrange(num_prey)] predators = [Predator(np.random.uniform(0, world_size[0]), np.random.uniform(0, world_size[1])) for _ inrange(num_predator)]
fig, ax = plt.subplots() scat_prey = ax.scatter([prey.x for prey in preys], [prey.y for prey in preys], c='blue') scat_pred = ax.scatter([pred.x for pred in predators], [pred.y for pred in predators], c='red') plt.xlim(0, world_size[0]) plt.ylim(0, world_size[1]) plt.gca().set_aspect('equal', adjustable='box') plt.title('Weak Meat and Strong Eat Simulation')
defupdate(frame): for prey in preys: prey.move() for pred in predators: pred.move(preys) scat_prey.set_offsets(np.c_[[prey.x for prey in preys], [prey.y for prey in preys]]) scat_pred.set_offsets(np.c_[[pred.x for pred in predators], [pred.y for pred in predators]]) return scat_prey, scat_pred
ani = FuncAnimation(fig, update, frames=200, interval=100, blit=True)