のライフゲームだが、ルールを変えればいくらでも面白い挙動を示すものを発見することができる。今日は、自作のルールを適用して、ちょっと面白い幾何学模様を生成するセルオートマトンで遊んでみた。
上に示す画像がそれだが、幾何学模様の面白さを示すためには、無圧縮の画像でないとダメなので、AVIファイル形式となっている。WindowsMedia形式では、圧縮に伴う画像の劣化があり、緻密な変化の面白さが判らないのだ。ダウンロードには少し時間がかかるかもしれないが、なかなか面白いので乞うご期待である。
20年ほど前は、このような計算負荷の重いシミュレーションがPC上で可能になるとは、夢にも思っていなかった。当時は、セルオートマトンに特化したPC用のISAボードが、MITで開発されており、私も大枚をはたいてアメリカから個人輸入して使ったものだ。セルオートマトンに特化したボードなので、速度は、当時の汎用スパコンの
CRAY-2並みと言われていた。このハードウェア処理によるシミュレーションのパラメータを設定するのに用いられていたのが
FORTHという言語だった。私がこの言語に接したのは、その時が初めてであったが、実に奇妙な、そして融通無碍な言語であった。
それはさておき、その後、PCのCPU処理速度が向上するにつれて、ハードウェアに頼らなくても汎用のCPU上でシミュレーションが可能となった。そのためのソフトウェアも市販されるようになり、何と、CADメーカとして有名なAutodesk社から「CA-LAB」というのが発売されていた。まだWindowsが出現する前のことなので、IBM互換PCのPC-DOS上で、これを動かして遊んだものである。
そして、現在、Windows化されたCA-LABが、前述のCellabである。CA-LABは、セルオートマトンのルールをCやPascalを用いて自分で定義することができたが、Cellabも同じ手法でルールを定義できる。上記の画像に用いられているルールは、私がCで書いたものであり、その内容は以下の通りだ。
#include "jcrule.h"
int jcrule(oldstate, nw, n , ne,
w, self, e,
sw, s , se
)
int oldstate, nw, n, ne, w, self, e, sw, s, se;
{
int count;
static int firstime = 1;
if (firstime) {
firstime = 0;
strcpy(patreq, "islam");
strcpy(palreq, "islam");
}
count = (nw*2 + n*3 + ne*2 + w*3 + e*3 + sw*2 + s*3 + se*2)%8;
if(((oldstate >> 2) & 0x01) == 0) {
if(count == 0 || count == 2 || count == 4) {
if(self == 1) {
return 7;
} else {
return 5;
}
} else {
if(self == 1){
return 6;
} else {
return 4;
}
}
}
if(((oldstate >> 2) & 0x01) == 1) {
if(count == 0 || count == 2 || count == 4){
if(self == 1) {
return 3;
} else {
return 1;
}
} else {
if(self == 1) {
return 2;
} else {
return 0;
}
}
}
}
変数等の詳しい内容は、前述のCellabのサイトにマニュアルが掲載されているので、興味のある人は、参照すると良いが、何はともあれ、オートマトンの
ムービーを見てみることをお勧めする。こんな単純なルールからは、思いもよらない多様なパターンが展開されるのに驚くことだろう。因みに、幾何学的な文様を次々と生成するので、このルールを「Islam」と名付けた。決定論的でありながら、予測不可能であるというのが、セルオートマトンの面白さだと改めて思う。