数値解析法及び演習 第十四回

ライフゲーム
  1. ライフゲームとは
  2. ライフゲームのプログラム
  3. 様々なパターン
  4. 今日の宿題

[1] ライフゲームとは

1970年に,ケンブリッジ大学のコンウェイによって作られたゲームである.二次元の碁盤の目を考える.それぞれのセルは二つの状態をとることができる.ここでは1(生)と0(死)とする.

正方形に碁盤の目は切られているので,斜め隣りも含めて周囲にマスは8個ある.

ライフゲームはあるステップから次のステップへの変換ルールを与えることで進行していく. そのルールは以下のとおり.

  1. あるセルは死んでいるとする. 周囲にちょうど3つの生きているセルがあれば次のステップでそのセルは生に変わる.
  2. あるセルは生きているとする. 周囲に2つか3つの生きているセルがあれば次のステップでもそのセルは生きつづける.
  3. 上記二つの場合以外では, 次のステップでそのセルは死となる.

練習問題1

横一列に生きたセルが3つ並んだパターン(ブリンカー)はその後どのような進化をするだろうか?


[2] ライフゲームのプログラム

上の規則をもとに, ライフゲームのプログラムを作成せよ.大まかなアルゴリズムは次のとおり.

  1. セルの情報を格納する二次元配列を宣言する.
          implicit none
          integer, parameter :: NX_MAX=130,NY_MAX=130
    
          integer :: cell(0:NX_MAX+1,0:NY_MAX+1)
          integer :: cellnew(0:NX_MAX+1,0:NY_MAX+1)
    
    今のステップの情報(cell)と,次のステップの情報(cellnew)とが必要なので二つ宣言する.実際に使うセルのx軸方向の範囲が1からNX_MAX(この例では130)とすると, 配列は0-131まで宣言しておくこと. 0, 131はライフゲームが行われる領域の外周に対応する.0と131ではセルは常に死んでいる (0) とする.
  2. cell(i,j),cellnew(i,j)を全て0にする.
  3. 初期配置のデータを読み込む. データの形式は
    3  <= 生きているセルの総数
    10 10 <= ここから下が生きているセルの座標(x座標,y座標の順)
    11 10
    12 10  
    
    のようにする. したがって, データの読み込みは以下のようにすること.
            read(1,*) ncell
            do i=1,ncell
               read(1,*) nx,ny
               cell(nx,ny)=1
            enddo
    
  4. ライフゲームの規則にしたがって, 次ステップのセルの生死を求め,cellnew(i,j)に書き込む.cell(i,j)に書き込んではいけない.外側境界(本来よりも多く設定してあるセル)を除くすべてのセルについてライフゲームの規則を当てはめる. 外側境界は変更せず, 死んだままにしておく.
  5. 生きているマスのx座標とy座標を並べてファイルに書き込む. 最後に
    write(2,*) ' '
    
    と空白を書き込むことにより一行の空行を作っておくこと. こうしておくとアニメーションがgnuplotで観察できる. つまり、出力されるデータの内容はたとえば以下のようになる(このデータも適当です).
    11 10
    12 14
    15 15
    
    15 15
    15 23
    14 24
    
    12 12
    12 22
    11 11
    10 19
    12 12
    
  6. 配列cellをcellnewで上書きする.
  7. 4, 5, 6をループさせる.
gnuplotで以下のコマンドを実行することでアニメーションを観察すること.
gnuplot> n=0
gnuplot> load 'anim.txt'
ここで,anim.txtの中身は以下のとおり.
  set xrange [0:131]
  set yrange [0:131]

  if (n>ループ回数) exit

  p "ファイル名" every :::n::n
  print n
  pause 0.1

  n=n+1

  reread

"ファイル名"に結果を出力したファイル名を記入すること.ループの回数を"ループ回数"に記入すること.xrange, yrangeの範囲はNX_MAX, NY_MAXと同じにすること.n=0の0を別の数字に書き換えるとそのステップから表示が開始される.pause 0.1 の数字を減らすとアニメが早くなる.

[3] 様々なパターン

ライフゲームは極めて単純な規則からなっているにも関わらず、極めて多様なパターンを生み出す. 上から順番に確認すること.

  1. 3つのセルが一列に並んだブリンカー
  2. 変化が起こらないブロック
  3. 周期的にパターンを変化させつつ平行移動するグライダー
  4. グライダーを食べてしまうイーター
  5. イーターを二つ並べた場合イーターの衝突
  6. わずか5個のセルから複雑な進化を遂げるRペントミノ
  7. きしゃポッポ横方向に十分広い範囲(NX_MAX=1300, NY_MAX=130)をとること.アニメを見るためのファイルのサイズが大きくなるので,アニメを観察したら消去すること.

[4] 今日の宿題 (1点:1/31日まで)

Rペントミノの進化を観察し、以下の問いに答えよ.

  1. 何ステップ目で進化はストップするか?(ブリンカーの回転は除く)
  2. 外側境界まで到達したグライダーは何機あるか?

プログラムと問いの答えを送付すること.次回は期末テスト.


[5] 追加の宿題 (1点:1/31日まで)

きしゃポッポの進化を観察し、以下の問いに答えよ.NX_MAX=1300, NY_MAX=130, 2000ステップまで計算すること.アニメを見る際は,マウスで画面を1:10程度に横長にする.

  1. 生きているセルのうち,もっとも右側に存在しているセルのx座標の移動速度を求めよ.ステップ数ともっとも右側に存在しているセルのx座標をファイルに書き出し,最小二乗法を用いることで速度(傾き)を有効数字2桁で求めよ.

プログラムと問いの答えを送付すること.アニメのファイルはサイズが大きくなるので,終了したらすぐさま消去しておくこと.




日程表へ戻る <<