フィボナッチ数列的な個体数の変化を,下記リンクの図のように表したかった. https://commons.wikimedia.org/wiki/File:FibonacciRabbit.svg
生成される図は下記のようになる.
上記の図は以下のプログラムで生成した.
import matplotlib.pyplot as plt from matplotlib.pyplot import plot from collections import deque def plotter(x_pos, y_poss): """ (x0, y0) = (x_pos, y_poss[0])の点と, (x0, y0) = (x_pos+1, y_poss[1])の点を結ぶ直線を引く y_possは2つ以上の要素を持つ """ plot([x_pos, x_pos + 1], [y_poss[0], y_poss[1]], "o-") pass qs = deque([(0, 0, 0)]) # qsの要素のタプルは,(1世代前のy座標, 自身のy座標, 自身が分裂するかのフラグ) print("qs ", qs) max_loop = 5 # あまり大きくするとプログラムの実行に時間がかかる for i_loop in range(max_loop): ql = len(qs) # 今の世代の個体数 qs_new = deque([]) # 新しい世代 cnt_made_e = 0 # 新しい世代を何個体作ったか,カウントしておく for i_ql in range(ql): # 今の世代をすべて見ていく e = qs.popleft() if e[2] == 0: # 「自身が分裂するかのフラグ」が0なら,分裂せずに自身は分裂できるようになる(=「分裂のフラグ」を1にする) # 自身を,「分裂のフラグ」を1にして新しい世代に生成 # 新しく追加する要素のタプルは,(eの(=1世代前の)y座標, i_loopのループで生成された個体の履歴, 「分裂のフラグ」) qs_new.append((e[1], cnt_made_e, 1)) plotter(i_loop, qs_new[-1]) cnt_made_e += 1 pass elif e[2] == 1: # 「自身が分裂するかのフラグ」が1なら,自身と,分裂できない個体(=「分裂のフラグ」が0の個体)を生成する # 自身を新しい世代に生成 qs_new.append((e[1], cnt_made_e, 1)) plotter(i_loop, qs_new[-1]) cnt_made_e += 1 # 自身から分裂した個体を生成 qs_new.append((e[1], cnt_made_e, 0)) plotter(i_loop, qs_new[-1]) cnt_made_e += 1 pass else: # 「分裂のフラグ」におかしい値があれば途中で終了 print(qs) exit(-1) pass pass qs = qs_new print("qs ", list(qs)) pass plt.show()