Pythonで一次元セルオートマトンの発展を描画するコードを書いてみました。最後にいくつかのルールで実行した結果を載せています。
#セル・オートマトン
セルオートマトン(cellular automaton)はある局所的な規則(ルール)によってセルの状態を発展させていくというもので、物理学者Stephen Wolframや数学者John Horton Conwayらによりその性質が詳細に研究されました。
ルールを変えることにより様々な自然現象を模すことができ、2次元のものは「ライフゲーム」として知られています。
一次元セルオートマトンのルールには番号がつけられています。例えばルール214とよばれる規則は上図のようになります。よくわからなければこちらの記事に詳しく書いてあるのでみていただければ良いかと思います。
#Pythonで実装
上の規則を実装してみます。
import matplotlib.pyplot as plt
def cellautomaton(l_bit, rule, pattern=False, padding=0):
# pattern: 周期的境界条件, padding: 枠外のセルの値
l_bit_new = []
if not pattern:
l_bit = [padding] + l_bit
l_bit.append(padding)
else:
l_bit = [l_bit[-1]] + l_bit
l_bit.append(l_bit[1])
for i in range(1, len(l_bit)-1):
l_bit_new.append(next_state(l_bit[i-1],l_bit[i],l_bit[i+1], rule))
return l_bit_new
def next_state(l, x, r, rule):
# 次のセルの状態を決定
bin_str = format(rule, '08b')
bin_num = int(str(l)+str(x)+str(r), 2)
return int(bin_str[-(bin_num+1)])
def main():
result = []
loop = 200
rule = 110 # ルール番号(0~255)
## リストxで初期状態を指定
x = [0]*200
x[-1] = 1
result.append(x)
for i in range(loop):
x = cellautomaton(x, rule, pattern=False)
result.append(x)
plt.figure()
plt.title("rule{}".format(rule))
plt.imshow(result, cmap="binary")
plt.show()
main()
デフォルトでは長さ100で、一番右のセルだけが1、あとは0の一次元配列にしてあります。色々いじって変えてみると面白いです。
最後にこのコードを使っていくつかのルールでの例をみてみます。
#ルール30
Stephen Wolframは一次元セルオートマトンの振る舞いを4つのクラスに分類しています。簡単にいうと次のような感じです。
- クラス1: 全て0、全て1のような状態に収束する
- クラス2: 決まった振動を繰り返す状態に収束する
- クラス3: カオスな状態になる
- クラス4: 周期的な状態とカオスな状態が共存する(カオスの縁)
複雑で周期性のない模様になっていることがわかります。
#ルール90
ルール90はクラス3に属する規則ですが、シルピンスキー・ガスケットと呼ばれるフラクタル図形を描きます。
フラクタル図形とは、拡大/縮小すると同じような形が現れるような図形です。
#ルール110
ルール110は周期的な状態とカオスの中間的な状態をとるクラス4に属する規則です。
周期性ができてしばらく続いて壊れる、といったのがみて取れると思います。このオーダーとカオスの中間的なダイナミクスは自然現象に多くみられることが知られ、またこのような領域の豊かなダイナミクスを利用して、チューリングマシンを模すこともできるそうです。
以上です。他のルールの図形はこの記事など、調べるといっぱいあります。実用的な例だとこの記事のように交通シミュレーションで使われることがあるようです。
#参考文献
図解雑学 複雑系(今野紀雄 ナツメ社)