このプログラム上の小さな生命「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のコードが公開されているので、見ることができます。
たとえば、メインループはこんな感じです。