人工生命Tierra9: 突然変異8の挙動について1
1. 解析までの流れ
解析までの流れを、自分の為にメモ。
①乱数の発生系列を設定する。
②Tierraを実行する。
③突然変異種による下剋上が発生した時点の記録フォルダを開く。
④個体数ランキングを見て1位の遺伝子型の体を調べる。
2. 突然変異8(乱数発生系列0)
遺伝子型番号: 8
乱数発生系列: 0
命令数: 約10万命令時点
突然変異8の体は↓のようになっていました。
3. 突然変異8の挙動解析
・突然変異が起きたのは、コピー実行コードを呼び出す(ジャンプする)部分。
元々の呼び出し先であるコピー実行コードの最初ではなく、コピー実行コードの後ろの方に飛ぶ。
・上記により体の一番上にある命令である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命令だけブランクとなります。
長くなりそうなので、突然変異8オリジナルのコピー2体目以降の挙動については次の記事に書きます。