[1] ライフゲームとは
1970年に,ケンブリッジ大学のコンウェイによって作られたゲームである.二次元の碁盤の目を考える.それぞれのセルは二つの状態をとることができる.ここでは1(生)と0(死)とする.
正方形に碁盤の目は切られているので,すぐ隣のマスは4個ある.斜め隣のも含めると,隣の数は4個増えて8個となる.
ライフゲームはあるステップから次のステップへの変換ルールを与えることで進行していく. そのルールは以下のとおり.
- あるセルは死んでいるとする. 周囲にちょうど3つの生きているセルがあれば次のステップでそのセルは生に変わる.
- あるセルは生きているとする. 周囲に2つか3つの生きているセルがあれば次のステップでもそのセルは生きつづける.
- 上記二つの場合以外では, 次のステップでそのセルは死となる.
練習問題1
上の規則をもとに, ライフゲームのプログラムを作成せよ.大まかなアルゴリズムは次のとおり.
- セルの情報を格納する二次元配列を宣言する. 今のステップの情報(例えばcell(0:101,0:101))と,次のステップの情報(例えばcelln(0:101,0:101))とが必要なので二つ宣言する.実際に使うセルのx軸方向の範囲が1-100とすると, 配列は0-101まで宣言しておくこと. 0と101は常にセルは死んでいるとする(境界条件の設定).
- 初期配置のデータを読み込む. データの形式は
4 <= 生きているセルの数
10 11
11 11
12 11
13 11 <= 生きているセルの座標
とする. したがって, データの読み込みは以下のようにすること.
read(1,*) ncell
do i=1,ncell
read(1,*) nx,ny
cell(nx,ny)=1
enddo
- ライフゲームの規則にしたがって, 次ステップのセルの生死を求める. 外側境界(本来よりも多く設定してあるセル)を除くすべてのセルについてらいふゲームの規則を当てはめる. 外側境界は手をつけず, 死んだままにしておく.
- 生きているマスのx座標とy座標を並べてファイルに書き込む. 最後に
write(1,*) ' '
と空白を書き込むことにより一行の空行を作っておくこと. こうしておくとアニメーションがgnuplotで観察できる.
- 今のステップのセル配列を次のステップのセル配列で上書きする.
- 3, 4, 5をループさせる.
gnuplotで以下のコマンドを実行することでアニメーションを観察すること.
gnuplot> n=0
gnuplot> load 'anim.txt'
ここで,anim.txtの中身は以下のとおり.
set xrange [0:101]
set yrange [0:101]
if (n>ループ回数) exit
p "ファイル名" every :::n::n w p 1
print n
pause 0.1
n=n+1
reread
"ファイル名"に結果を出力したファイル名を記入すること.ループの回数を"ループ回数"に記入すること.xrange, yrangeの範囲は適宜変更すること.
[2] 様々なパターン
ライフゲームは極めて単純な規則からなっているにも関わらず、極めて多様なパターンを生み出す. 単純な例から順番に見ていってほしい.
- 3つのセルが一列に並んだブリンカー
- 変化が起こらないブロック
- 周期的にパターンを変化させつつ平行移動するグライダー
- グライダーを食べてしまうイーター
- イーターを二つ並べた場合イーターの衝突
- わずか5個のセルから複雑な進化を遂げるRペントミノ 130×130セル以上の範囲をとっておくこと.