アプリ画面上のViewに生命があったら面白いだろうなとふと思いつき、UIViewに生命らしさを実装してみました。
(そもそもコンピュータ上のプログラムを生命と呼んでいいかどうかには異論があるかと思いますが)
生命の定義は生物学者によってもまちまちなのですが、今回は以下のように生命を定義してみました。
a. 自己複製ができる
b. 外部と代謝(物質のやりとり)ができる
c. 遺伝子が存在し、遺伝子が一定以上異なる個体は別種とみなされる
複雑な生命を実装するのは難しいので、今回はバクテリアやアメーバなどの無性の単細胞生物をイメージして、上記を以下のような方法でViewに実装してみました。
- 個体がある一定以上の大きさになると分裂する。
- 分裂の際に、個体の遺伝子が複製される。その際わずかな遺伝子の変異がランダムに起きる。
- 遺伝子には、個体の動くスピード、個体の大きさ、個体の肉食性を決定する3つのものがある。
- ある特定のエリアにおいて、個体にリソースが補給される。そのゾーン以外では補給されない。補給速度は肉食度が高くなると低下する。
- 遺伝子が一定以上異なる個体が重なっていると、その個体を他種とみなし捕食行動が行われる。捕食速度は肉食度が高くなる、もしくは個体サイズが大きくなると向上する。捕食活動により被捕食者からはリソースが奪われ、捕食者に与えられる。
- 個体は、体の大きさに応じた速度でリソースを消費する。
- 個体は、移動速度に応じた速度でリソースを消費する。
- 4.5.6.7.によって獲得、もしくは消費されたリソースの合計値が正であればその値に応じて個体のサイズが拡大し、合計値が負であればその値に応じて個体のサイズは縮小する。
- サイズが一定の値以下になった個体は死亡したとみなされる。
- 各個体はランダムウォークで移動するが、予め設定した境界より外に移動することはできない。
実行結果を動画にしました。
3時間程度ありますので、かいつまんで見ることをお勧めいたします。
https://youtu.be/TZHDfr969ZM




やがて遺伝子に多様性が生じ、様々な色、大きさのViewが誕生します。種ごとにコロニーが形成される傾向も見えます。画像からは分かりませんが、種によって移動スピードも様々です。
以下に観察された現象の例を挙げます。
・肉食性の強い種が周囲のViewを食べつくて大増殖した結果、食料となるViewの欠乏により餓死してしまう。
・上記で空いたスペースに小さくて動きの早い種が瞬く間に入り込む。
・全エリアの半分を占めるほど支配的になった種が、種の内部分裂により自壊してしまう。
・周囲からの干渉を受けにくい画面端には、動くが遅くサイズが大きい種が育ちやすい。
単純な生命だけではなく人類の拡散や国家の盛衰など様々なスケールの現象のモデルになるかもしれませんね。

閉じた系では生命の多様性が一旦広がった後、やがて収束に向かうというのは興味深いです。
人類が宇宙に進出したがるのも、ひょっとしたらこのような収束状態に向かうのに抵抗するためなのかもしれません。
今後、性の概念と知性の概念をViewに導入することも考えています。人工知能のロジックの開発において、いい実験対象になるでしょう。
今回の実験結果はあまりアプリ開発に直接役立つものではありませんが、生命のしくみを模する事はより深みのあるゲーム開発やUI/UXの開発につながる可能性があるかもしれませんね。
今回作成したコードをGitHubで共有したいと思います。
https://github.com/yukinaga/LivingView