コードで表現される人工生命Vendian ~遺伝的アルゴリズムとコード

こんにちは。Vendianという人工生命シミュレータを紹介したいと思います。



このプログラム上の小さな生命「Vendian」は、アセンブリ言語のようなプログラミング言語で活動します。




人工生命の遺伝子というコード


地球上の生命は、遺伝子によってがプログラミングされています。

それなら、生命シミュレータのコードとして遺伝子を使えばシンプルになるはずです。


シミュレーション環境のルール


Vendianが住んでいる世界は、緑色のピクセルで表される食糧でいっぱいです。

時間とともに、これらの緑色のピクセルはより明るくなり、大量の食糧を表します。

Vendianたちは生き続け、また子孫を持つために食糧を食べようとします。

人工生命Vendianの動作プログラム


だから彼らは次のような単純なプログラムを持っています:

 MoveForward
 TestFood 0,0,1
 BrancheNonEqual 1,0,2
 Jump -3
 Eat
 TurnRandom
 LoadEnergy 2
 BrancheGreater 2,700,2
 Jump -9
 Fork30

この簡単なプログラムは、食べ物を探して子孫を産む動物の行動を記述しています。

プログラムコードのセマンティック

MoveForword 向いている方向に動きます。

TestFood 0,0,1 現在のセルの食べ物の量をメモリアドレス1に読み込みます
(最初の2つのパラメータは、現在の位置を基準にしてテストするセルを、最後のパラメータのメモリ位置を指定します)。

BrancheNonEqual 1,0,2  
メモリアドレス1の値が0(2番目のパラメータ)と異なる場合、2行(3番目のパラメータ)にジャンプします。

Jump -3 制御を3行戻します。すなわち、先頭に戻ります。

Eat (もし食べ物があったら)それを食べます。

TurnRandom 左または右に向きを変えます。

LoadEnergy 動物が持っている現在のエネルギー量をレジスタ2に読み込みます。

BrancheGreater 2,700,2 2番レジスタが700より大きい場合、2行進みます

Fork 2つの新しいVendianに分割されます。

Jump -9 制御を最初(9行前)に戻します。

コピーエラーが人工生命を進化させる

Forkするときにプログラムは子孫にコピーされますが、まれにエラーが生じる場合があります。

パラメータが変更されたり、プログラムの一部が複製または削除されたり、ランダムなステートメントが挿入されたりします。

つまり、遺伝的アルゴリズムによって、コードは進化します。

複製が100回になる度にVendianのコードはログにダンプされます。
プログラムを再起動すると、ログのVendianがすべてインスタンス化されます。

人工生命はどれぐらい複雑に進化するか


これによって、だいたい5000世代たったコードが以下です

TestFood -3,3,2
Eat
MoveForward
TestFood 0,0,1
BrancheNonEqual 1,0,2
Jump -3
TestFood 0,1,2
SubsRegs 3,2,1
BrancheGreater 3,-4,-7
Eat
TurnRandom
LoadEnergy 2
BrancheGreater 2,701,2
Jump -10
BrancheGreater 2,550,4
LoadEnergy 2
BrancheGreater 0,617,9
Jump -10
BrancheGreater 2,697,4
LoadEnergy 1
BrancheGreater -3,617,12
Jump -10
Fork 47
BrancheGreater -2,727,12
Jump -9
Jump -10
Jump -10
Fork 47
BrancheGreater -2,727,12
Jump -9
Jump -10
Jump -12
BrancheGreater -5,616,12
Jump -14
TestObstacle 218,54,199
TurnRandom
Jump -12
BrancheGreater -4,821,11
TestObstacle 218,54,198
TurnRandom
BrancheGreater -3,616,18
Jump -12
Fork 46
BrancheGreater -4,617,14
Jump -15

だいぶ冗長なコードが増えていますね。

Vendianのプログラムのソースコード


Vendianそのものは2002年にDouwe Osingaさんが作りました。
GPLでpascalのコードが公開されているので、見ることができます。
たとえば、メインループはこんな感じです。



参考:Vendianをダウンロードする