Python

リスの繁殖をシミュレーションしてみる3

Python

[PR]当サイトはアフィリエイト広告を利用しています。

リスの繁殖シリーズ第3弾です。

前回はリス自身のクラスを作成しました。

今回はプログラム本体です。

早速作成したクラスなどを使ってリスの残数を求めていきます。

#セルの作成
cells = []
row = 10
col = 10
for i in range(row):
    cells.append([])
for i in range(row):
    for j in range(col):
        if(i == 0) or (i == (row - 1)):
            cells[i].append(cell(True))
        elif(j == 0) or (j == col - 1):
            cells[i].append(cell(True))
        else:
            cells[i].append(cell(False))
#リスのインスタンスの作成
indivs = []
indivs.append(indiv(1,1))
cells[indivs[0].x][indivs[0].y].active = True
indivs.append(indiv(row - 2, col - 2))
cells[indivs[1].x][indivs[1].y].active = True
#経過年数の設定
year = 20
tmax = 12 * year
#シミュレーション
for t in range(tmax):
    for j in range(len(indivs)):
        #食物を消費。消費できないなら移動
        if(indivs[j].life == True):
            if(cells[indivs[j].x][indivs[j].y].f >= cells[indivs[j].x][indivs[j].y].r):
                cells[indivs[j].x][indivs[j].y].consumption()
            else:
                x,y = indivs[j].move(cells)
            indivs[j].die(cells)
    #食物の回復
    for k in range(row):
        for l in range(col):
                cells[k][l].recov()
    #リスの繁殖
    if((t % 12) == 0) and (t != 0):
        survivalNum = 0
        for k in range(len(indivs)):
            if(indivs[k].life == True):
                survivalNum += 1
        #アクティブなセルを集計
        surplus = []
        for k in range(row):
            surplus.append([])
            for l in range(col):
                if(cells[k][l].wall == True):
                    surplus[k].append(True)
                else:
                    surplus[k].append(cells[k][l].active)
        for k in range(4 * (survivalNum // 2)):
            surplusFlag = True
            surplusFlag2 = True
            #移動できるセルが存在すればフラグは下りる
            for l in range(row):
                for m in range(col):
                    if(surplus[l][m] == False):
                        surplusFlag = False
                        surplusFlag2 = False
                        break
                else:
                    continue
                break
            #移動できるセルを選択
            while(surplusFlag == False):
                tempX = random.randint(1, row - 2)
                tempY = random.randint(1, col - 2)
                #移動できるなら片方のフラグを上げて片方を下げて繰り返しを抜ける
                if(cells[tempX][tempY].active == False):
                    surplusFlag = True
                    surplusFlag2 = False
            #移動できるセルがあるなら増殖
            if(surplusFlag2 == False):
                indivs.append(indiv(tempX, tempY))
                cells[tempX][tempY].active = True
                surplus[tempX][tempY] = True
            else:
                break
        #その年の生き残りを計算
        print(t // 12, "年目", end=' ')
        countSurvive = 0
        for j in range(len(indivs)):
            if(indivs[j].life == True):
                countSurvive += 1
        print("生存数: ", countSurvive)

詳細はプログラム中のコメントをご覧ください。

流れとしては

セルの作成

リスのインスタンスの作成

経過年数の設定

シミュレーション開始

リスが行動

食物の回復

リスの繁殖

生き残ったリスを集計

このような流れとなります。

出力は以下。

ただし

self.r = 2

self.f = 3

self.re = 1

self.fmax = 3

つまり消費は2で食物は最大3で毎時1ずつ食物が回復するという設定です。

1 年目 生存数: 6

2 年目 生存数: 18

3 年目 生存数: 54

4 年目 生存数: 64

5 年目 生存数: 48

6 年目 生存数: 55

7 年目 生存数: 64

8 年目 生存数: 64

9 年目 生存数: 49

10 年目 生存数: 64

11 年目 生存数: 48

12 年目 生存数: 64

13 年目 生存数: 64

14 年目 生存数: 42

15 年目 生存数: 64

16 年目 生存数: 55

17 年目 生存数: 64

18 年目 生存数: 49

19 年目 生存数: 61

これをグラフにすると以下となります。

最初の停滞時間は表現できていませんが、いきなり上昇してそれを維持するのはロジスティックモデルになっているのではないでしょうか。

今回はここまで。

次回は実際のセルの移り変わりを画像で見ていきたいと思います。