雑感等

音楽,数学,語学,その他に関するメモを記す.

フィボナッチ数列の兎の個体数増加をグラフで

フィボナッチ数列的な個体数の変化を,下記リンクの図のように表したかった. https://commons.wikimedia.org/wiki/File:FibonacciRabbit.svg

生成される図は下記のようになる. f:id:kazmus:20201201193004p:plain

上記の図は以下のプログラムで生成した.

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()