PCガジェットはいつでも安いAmazonで!

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

前回はリスの繁殖のシミュレーションとその結果を載せました。

今回はマスの移り変わりを動画と画像で考えてみたいと思います。

まずシミュレーション結果を画像にする必要があるため描画するクラスを作ります。

The Python Imaging Library (PIL) is

    Copyright © 1997-2011 by Secret Labs AB
    Copyright © 1995-2011 by Fredrik Lundh

Pillow is the friendly PIL fork. It is

    Copyright © 2010-2021 by Alex Clark and contributors

Released under the open source HPND License

https://raw.githubusercontent.com/python-pillow/Pillow/master/LICENSE

from PIL import Image, ImageDraw, ImageFont

class Img:
    def __init__(self, cells, width, height, row, col, path, t):
        self.cellInfo = cells
        self.width = width
        self.height = height
        self.row = row
        self.col = col
        self.path = path
        self.type = ".png"
        self.t = t
    def drawing(self):
        im = Image.new("RGB", (self.width, self.height), (255, 255, 255))
        draw = ImageDraw.Draw(im)
        for i in range(self.row):
            for j in range(self.col):
                #各セルの色を設定
                colorR = math.floor(255 * (1 - self.cellInfo[i][j].f / self.cellInfo[i][j].fmax))
                colorG = 255
                colorB = math.floor(255 * (1 - self.cellInfo[i][j].f / self.cellInfo[i][j].fmax))
                #セルを描画
                draw.rectangle((i * (self.width / self.row), j * (self.height / self.col), (i + 1) * (self.width / self.row), (j + 1) * (self.height / self.col)), fill=(colorR, colorG, colorB))
                #セルの状態で色を変える
                if(self.cellInfo[i][j].active == True):
                    draw.rectangle((i * (self.width / self.row), j * (self.height / self.col), (i + 1) * (self.width / self.row), (j + 1) * (self.height / self.col)), fill=(255, 0, 0))
                if(self.cellInfo[i][j].wall == True):
                    draw.rectangle((i * (self.width / self.row), j * (self.height / self.col), (i + 1) * (self.width / self.row), (j + 1) * (self.height / self.col)), fill=(0, 0, 0))
                if(self.cellInfo[i][j].recoveryTime == True):
                    draw.rectangle((i * (self.width / self.row), j * (self.height / self.col), (i + 1) * (self.width / self.row), (j + 1) * (self.height / self.col)), fill=(0, 0, 255))
        #経過年数を描画
        font = ImageFont.truetype('使いたいフォントへのパス', 15)
        tempYear = (self.t // 12) + 1
        draw.multiline_text((self.width - 50, self.height - 50), 'year:' + str(tempYear), fill=(255, 255, 255), font=font)
        #画像ファイルで書き出し
        im.save(self.path + str(t) + self.type)

詳しい中身はコードのコメントを参照してください。

描画用のライブラリとしてPillowを使用しています。

10年分のセルの移り変わりを動画にしてみました。

緑のセルが何もいないセル。

赤がアクティブなセル。リスがいます。

青が食物を回復中のセル。

前回の生存数のグラフによるとあるときに一気に増えて、それを維持する感じになっていました。

セルがマックスまでアクティブになってそれからどうなるか少し画像で見てみます。

まずマックスになったとき。

その一つ次の状態。

回復中のセルがたくさんできます。つまり移れるセルがないのでこの分だけリスが死亡したということです。

その次の状態。

回復が完了して移れる状態になった緑のセルがそれなりに現れ、アクティブなセルが回復中になったのでこの分だけ移動しなければいけないリスが発生します。しかし移れる緑のセルが存在するため、リスは死亡せず移ることができます。

そして次の状態。

アクティブなセルと緑のセルが程よくバランスしている状態に戻りました。

おそらく生存数が一定になっている状態はこのような状況が繰り返されていると思われます。

結局増殖するときにマックス全部埋めるくらいになるんだけど、そこから資源を食べつくす個体にばらつきがあるから、半分くらいは生き残って、それが移動しながら一年をやり過ごし、またマックスくらいになるんだけど、食い尽くすタイミングにばらつきがあるから半分くらい生き残るという話のようです。

まあロジスティックモデルっぽくなっているのでシミュレーションはまあまあ成功したのではないでしょうか。

意味があるかは微妙なシミュレーションでしたが、とりあえずの意味としては

ある程度自然回復するフィールドでフィールドの食物を一定量消費する個体が定期的に移動と繁殖をすると絶滅せずに一定数の個体を維持しながら種を継続できるということがわかった。

ということでしょう。

もちろん消費量と回復速度の設定によってはすぐ絶滅する結果となる場合もありました。

あまりに消費しすぎる、回復が遅すぎるだと絶滅してしまうので、程よいパラメーターになるように動物は自身の大きさや消費量、繁殖数を遺伝子に組み込んでいるのでしょうね。

まあ当たり前の話ではありますが。

これにてリスの繁殖シリーズは終了です。

お付き合いいただきありがとうございました。

目次