前提・実現したいこと
pythonでアニメーションを用いた捕食者被食者増減シミュレーションをしています。
'list' object has no attribute 'get_zorder'というエラーが出てしまったのですが、初心者でどう修正すれば良いかわからないので教えていただければ幸いです。
シミュレーションの設定は以下の通りです
被食者:トウヒノシントメハマキ(青)
S秒につき(その時点にいるトウヒノシンノメハマキの数)×1匹増加する
誕生からK秒経過した個体は死亡する
ランダムに移動する
捕食者:トウヒノシントメハマキを捕食する任意の虫(赤)
捕食者の一定距離(R)に入るとトウヒノシンノメハマキは捕食される
餌(トウヒノシントメハマキ)を一匹食べるごとに一匹増加する
ランダムに移動する
誕生からK秒経過した個体は死ぬ
尚、S,N,R,Kは実験によって数値を変える
初期被食者個体数はM、初期捕食者数はmとする
発生している問題・エラーメッセージ
'list' object has no attribute 'get_zorder'
該当のソースコード
# 必要なライブラリのインポート import matplotlib matplotlib.use('nbagg') import random import numpy as np import matplotlib.pyplot as plt from matplotlib import animation, rc from IPython.display import HTML # 定数 N = 200 R = 0.5 # 近隣を規定する数値 S = 10 #被食者が増加する時間 K = 15 #被食者捕食者が誕生してから死亡するまでの秒数 M = 50 #初期被食者数 m = 10 #初期捕食者数 # パラメータの設定 t_span = [0, 20] # 観測時間 dt = 0.2 # 観測間隔 # Agentクラス class Agent: # コンストラクタ def __init__(self, cat): self.category = cat self.x = random.uniform(-10,10) self.y = random.uniform(-10,10) # 次時刻の状態の計算 def calcnext(self): if self.category == 0: self.cat0() elif self.category == 1: self.cat1() elif self.category == 2: self.cat2() else: print("ERROR カテゴリがありません\n") # カテゴリ0の計算メソッド(被食者) def cat0(self): self.x += (random.random() - 0.5) * 2 self.y += (random.random() - 0.5) * 2 # カテゴリ1の計算メソッド(捕食者) def cat1(self): self.x += (random.random() - 0.5)*2 self.y += (random.random() - 0.5)*2 #カテゴリー2の計算メゾット(スタンバイ) def cat2(self): self.x += (random.random() - 0.5)*2 self.y += (random.random() - 0.5)*2 # 時間ごとの状態遷移 def state_transition(t_span, dt, a): x, y, cats, birth, death = [[] for i in range(N)], [[] for i in range(N)], [[] for i in range(N)],[0 for i in range(N)],[0 for i in range(N)] t = np.arange(t_span[0], t_span[1], dt) count_birth = 0 for i in range(len(t)): for j in range(len(a)): # 次周期の状態の計算 a[j].calcnext() # エージェントごとに時刻iの座標とカテゴリを追記する x[j].append(a[j].x) y[j].append(a[j].y) cats[j].append(a[j].category) if a[j].category == 0: if birth[j] < S: birth[j] += 1 elif birth[j] >= S: birth[j] = 0 for l in range(len(a)): if a[l].category == 2: a[l].category = 0 break if death[j] < K: death[j] += 1 elif death[j] >= K: death[j] =0 a[j].category = 2 # カテゴリ1のエージェントとの距離がRより小さいとき,カテゴリ1に変わる elif a[j].category == 1: for k in range(len(a)): if ((a[k].x - a[j].x) * (a[k].x - a[j].x) + (a[k].y - a[j].y) * (a[k].y - a[j].y)) < R: a[k].category = 1 if death[k] < K: death[k] += 1 elif death[k] >= K: death[k] =0 a[j].category = 2 return t, x, y, cats # アニメーションの一ステップごとの処理 def one_step(j, x, y, cats): for i in range(N): dots[i].set_data(x[i][j], y[i][j]) if cats[i][j] == 0: dots[i].set_color('blue') elif cats[i][j] == 1: dots[i].set_color('red') return dots, # 見た目の設定 def draw(): fig, ax = plt.subplots() plt.close() dots = [] for i in range(N): dot, = ax.plot([], [], c='white', marker='.') dots.append(dot) ax.set_xlim(-20, 20) ax.set_ylim(-20, 20) ax.set_aspect('equal') ax.axes.xaxis.set_visible(False) ax.axes.yaxis.set_visible(False) return fig, dots # Agentの生成 a = [Agent(2) for i in range(N-M-m)] #白 a.extend([Agent(0) for i in range(M)])#青 a.extend([Agent(1) for i in range(m)])#赤 # 時間発展 t, x, y, cats = state_transition(t_span, dt, a) count0 = 0 count1 = 0 for i in range(N): if a[i].category == 0: count0 += 1 elif a[i].category == 1: count1 += 1 print("最終個体数\n") print("被食者",count0,"匹\n捕食者",count1,"匹") # アニメーションの描画 fig, dots = draw() ani = animation.FuncAnimation(fig, one_step, fargs=(x, y, cats), frames=np.arange(0, len(t)), interval=300, blit=True) # colabでアニメーションを動かすためのコード rc('animation', html='jshtml') ani
試したこと
補足情報(FW/ツールのバージョンなど)
google colaboratoryを使用しています
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/08 10:22