人工生命Tierraの作成等についてのブログ

人工生命Tierraや他の技術的な事柄、また日々の出来事などについても書いていきます。

人工生命Tierra9: 突然変異8の挙動について1

f:id:kkeiekk:20180204021828p:plain

1. 解析までの流れ

解析までの流れを、自分の為にメモ。

①乱数の発生系列を設定する。

②Tierraを実行する。

③突然変異種による下剋上が発生した時点の記録フォルダを開く。

④個体数ランキングを見て1位の遺伝子型の体を調べる。

2. 突然変異8(乱数発生系列0)

遺伝子型番号: 8

乱数発生系列: 0

命令数: 約10万命令時点

f:id:kkeiekk:20180204025053p:plain

突然変異8の体は↓のようになっていました。

f:id:kkeiekk:20180204043449p:plain

3. 突然変異8の挙動解析

f:id:kkeiekk:20180210212433p:plain

・突然変異が起きたのは、コピー実行コードを呼び出す(ジャンプする)部分。

元々の呼び出し先であるコピー実行コードの最初ではなく、コピー実行コードの後ろの方に飛ぶ。

・上記により体の一番上にある命令であるnop_1(アドレス0)だけが飛ばされ、それ以外の命令は普通にコピーされる。

つまり最初に発生した突然変異8は体の一番上にnop_1を持っているが、自己増殖によって生まれる子供は体の一番上は空欄になる。

・アドレス44~46のpush ax,bx,cxを飛ばすためレジスタの値は保存されず、2体目のコピー作成時は挙動が異なる。

・上記より、

突然変異8オリジナルの1体目のコピー作成時の挙動、

突然変異8オリジナルの2体目以降のコピー作成時の挙動、

突然変異8の子供の挙動、

はそれぞれ異なる。

(詳しくは後述。)

3.1. 突然変異8の挙動解析:突然変異8オリジナルのコピー1体目

突然変異が起きたのは、コピー実行コードを呼び出すためのcall命令の後にある目印の部分でした。

元々はこの目印(アドレス29~32)は

nop_0

nop_0

nop_1

nop_1

となっており、このパターン(1011)はコピー実行コードの最初(アドレス40~43)にある目印

nop_1

nop_1

nop_0

nop_0

の相補的なパターンです。

そのため元々はコピー実行コードを呼び出す(現在実行しているcall命令のアドレスを記録してそこへジャンプする)はずでした。

 

これが突然変異により

nop_1

nop_0

nop_1

nop_1

に変わったため、相補的なパターン

nop_0

nop_1

nop_0

nop_0

である、コピー実行部分の終わり(アドレス55~58)を呼び出します。

 

アドレス44~46のpush ax,bx,cxを飛ばすため現在のレジスタの値は保存されません。

よって1回目のコピー体(1人目の子供)作成が終わって同様に2人目の子供を作成しようとしても、ax,bx,cxの値は元通りにならないため異なる挙動になります。

またアドレス 51のmov_iabも飛ばすため、最初の命令1個分のコピーは実行されません。

アドレス59に飛んだ後はコピーループに入るため、最初の命令1個分のコピー以外は通常通りコピーが実行されます。

つまりコピーされた子供の体は先頭の1命令だけブランクとなります。

f:id:kkeiekk:20180210040049p:plain 

長くなりそうなので、突然変異8オリジナルのコピー2体目以降の挙動については次の記事に書きます。

前:人工生命Tierra8_Tierraを知ったきっかけ

次:人工生命Tierra10_突然変異8の挙動について2