生命を生命たらしめているもの,もしくは生命の定義とは何だろうか? よく引き合いに出されるのは:
といったものである.しかし,私がポスドクをやっていた神戸大にいたある先生は,生命の重要な性質として「予想外」をあげていた.葉の先端に向かって歩き続けていたテントウムシが突然何を思ったか方向を変えるように.すべて予想どおりの振る舞いをするものは生命というよりも機械であろう.
この授業で延々と使ってきた計算機は,言うまでもなく機械である.すべて予想された,想定された振る舞いをする.この中でプログラムを組み,望んだ結果をだす.しかし今日はちょっと変わったことをやってみよう.ただ三つの規則からまったく予想外の振る舞いを示すプログラムである.その振る舞いを見ていると,背後にある規則がただ三つだけとはとても思えない.だとすると生命と機械の違いは何だろうか?
1970年に,ケンブリッジ大学のコンウェイによって作られたゲームである.二次元の碁盤の目を考える.それぞれのセルは二つの状態をとることができる.ここでは1(生)と0(死)とする.
正方形に碁盤の目は切られているので,斜めも含めて隣にはマスが8個ある.
ライフゲームはあるステップから次のステップへの変換ルールを与えることで進行していく. そのルールは以下のとおり.
横一列に生きたセルが3つ並んだパターン(ブリンカー)は,上の規則をあてはめるとその後どのような進化をするだろうか?
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)
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
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
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と同じにすること.
ライフゲームは極めて単純な規則からなっているにも関わらず、極めて多様なパターンを生み出す. 単純な例から順番に見ていってほしい.