さて、すべてのセルオートマトンは「再発関係」を中心に構築されているため、時間tでの状態は時間t -1での状態に依存します。したがって、すべてのセルオートマトンには基本構造があり、配列など、状態を表すデータ構造があります。したがって、抽象的には、プログラムは次のようになります。
State t
/* initialize t */
while(/* end condition isn't satisfied */){
t = rule(t);
/* display state somehow */
}
ここで、rule(t)
はその次の状態を計算する関数です。
次のステップは、状態を表すデータ構造を考え出すことです。これは実際には簡単です。基本的な1dセルオートマトンの状態は、1と0のベクトルにすぎません。
したがって、14個の小さな数の配列が必要です。スペースは問題にならないので、intを使用します。
int t[14] ; /* state vector*/
終了条件は簡単です-55行を実行することになっているので、
int count = 0;
while(count++ < 55)
行0〜54、つまり55が得られることに注意してください。Cの適切な基本パターンは、0から開始し、ポストインクリメントし、テストが未満であるということです。おそらく、Cで記述した10個のループのうち9個がそのパターンになります。
最後に、問題はルールをどのように実装するかです。残念ながら、これはCであるため、私の説明のように単純に行うことはできません。ルールは、その場でベクトルを更新する必要があります。それはよく似ているでしょう
void rule(int t[]){
/* compute the update here */
}
さて、更新を計算する方法を正確に説明するつもりはありません。そうすると、楽しみがまったく得られないからです。しかし、ルール110に関するウィキペディアの記事がおもしろいと思うかもしれません。
それを読むときは、これを熟考してください。この単純なルールは「チューリング完全」です。これは、計算を表現する能力があることを意味します。その単純なルールは、それ自体、理論的な意味での「コンピューター」です。
アップデート
さて、ルールについてもう少し。Wiki記事のルールテーブルをご覧ください。これが示すのは、配列の3つのセルを取得し、3つのセルの中央のセルの次の値を決定することです。
したがって、ルールでは、渡す配列tと、次の瞬間の配列が必要です。これをt1と呼びます。
void rule(int t[]){ // there's the original
int t1[14]; // there's the new array
int ix ; // an index for the loop that's coming up
配列の各セルを調べたい
for(ix=0; ix < 14; ix++){
セルと左右のセルを確認します
if(t[ix-1] == 0 && t[ix] == 0 && t[ix+1] == 0)
t1[ix] = 0;
else if(t[ix-1] == 0 && t[ix] == 0 && t[ix+1] == 1)
t1[ix] = 1;
等々。エッジで何が起こるか、つまり、いつix == 0
または。について考える必要がありますix == 13
。
最後に、にコピーして戻すには別のfor
ループが必要になります。t1
t