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

ライフゲーム
  1. ライフゲーム
  2. 様々なパターン
  3. 今日の宿題

[0] 計算機と生命

生命を生命たらしめているもの,もしくは生命の定義とは何だろうか? よく引き合いに出されるのは:

  1. 子孫を残す
  2. 進化する
  3. 代謝をする(食べて出す)
  4. 細胞膜で区切られている

といったものである.しかし,私がポスドクをやっていた神戸大にいたある先生は,生命の重要な性質として「予想外」をあげていた.葉の先端に向かって歩き続けていたテントウムシが突然何を思ったか方向を変えるように.すべて予想どおりの振る舞いをするものは生命というよりも機械であろう.

この授業で延々と使ってきた計算機は,言うまでもなく機械である.すべて予想された,想定された振る舞いをする.この中でプログラムを組み,望んだ結果をだす.しかし今日はちょっと変わったことをやってみよう.ただ三つの規則からまったく予想外の振る舞いを示すプログラムである.その振る舞いを見ていると,背後にある規則がただ三つだけとはとても思えない.だとすると生命と機械の違いは何だろうか?


[1] ライフゲーム

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

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

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

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

練習問題1

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

練習問題2

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

  1. セルの情報を格納する二次元配列を宣言する.
    今のステップのセル情報を格納する配列(例えばcell(0:101,0:101))と,次のステップの配列(例えばcellnew(0:101,0:101))とが必要なので二つ宣言する.セルのx軸方向の範囲が1-100とすると, 配列は0-101まで宣言しておく. これは,外側境界を設定するためであり,0と101ではセルは死んでいるとする. 配列の宣言は,parameter文を使って次のようにしておくと後で配列サイズを変更するのが便利である.NX_MAXとNY_MAXが左右上下それぞれのサイズとなる.
          implicit none
          parameter (NX_MAX=130)
          parameter (NY_MAX=130)
          integer  cell(0:NX_MAX+1,0:NY_MAX+1)
          integer  cellnew(0:NX_MAX+1,0:NY_MAX+1)
    
  2. すべてのセル(cell(i,j),cellnew(i,j))は死んでいる(0)とする.
  3. 初期配置のデータを読み込む. データの形式は
    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
    
  4. ライフゲームの規則にしたがって, cell(i,j)を元に次ステップのセルの生死を求める. 外側境界(本来よりも多く設定してあるセル)を除くすべてのセルについてライフゲームの規則を当てはめる. 外側境界には手をつけず, 死んだままにしておく.次ステップの生死(0か1)は配列cellnew(i,j)に代入すること.
  5. 生きているマスのx座標とy座標を並べてファイルに書き込む. 最後に
    write(1,*) ' '
    
    と空白を書き込むことにより一行の空行を作っておくこと. こうしておくとアニメーションが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. 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の範囲はNX_MAX, NY_MAXと同じにすること.

[2] 様々なパターン

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

  1. 3つのセルが一列に並んだブリンカー
  2. 変化が起こらないブロック
  3. 周期的にパターンを変化させつつ平行移動するグライダー
  4. グライダーを食べてしまうイーター
  5. イーターを二つ並べた場合イーターの衝突
  6. わずか5個のセルから複雑な進化を遂げるRペントミノ 計算領域は130×130の範囲をとっておくこと.

[3] 今日の宿題 (1/29日まで)

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

  1. 何ステップ目から変化は無くなるか?(ブリンカーの回転は除く;初期配置は0ステップ目とする)
     ヒント:gnuplotにおいて,plot 'ファイル名' every :::ステップ数::ステップ数 とすると,そのステップ数におけるパターンが表示される.
  2. 外側境界まで到達したグライダーは何機あるか?

プログラムと問いの答えを送付すること.




日程表へ戻る <<