1

この記事は最終更新日から3年以上が経過しています。

Pythonで一次元セル・オートマトンを実装してみた

最終更新日 投稿日 2020年05月26日

Pythonで一次元セルオートマトンの発展を描画するコードを書いてみました。最後にいくつかのルールで実行した結果を載せています。

セル・オートマトン

セルオートマトン(cellular automaton)はある局所的な規則(ルール)によってセルの状態を発展させていくというもので、物理学者Stephen Wolframや数学者John Horton Conwayらによりその性質が詳細に研究されました。
ルールを変えることにより様々な自然現象を模すことができ、2次元のものは「ライフゲーム」として知られています。

ルール

Untitled Diagram.png

一次元セルオートマトンのルールには番号がつけられています。例えばルール214とよばれる規則は上図のようになります。よくわからなければこちらの記事に詳しく書いてあるのでみていただければ良いかと思います。

Pythonで実装

上の規則を実装してみます。

1d_ca.py
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: 周期的な状態とカオスな状態が共存する(カオスの縁)

ルール30はクラス3のカオスな状態になる規則です。rule30.png

複雑で周期性のない模様になっていることがわかります。

ルール90

ルール90はクラス3に属する規則ですが、シルピンスキー・ガスケットと呼ばれるフラクタル図形を描きます。
rule90.png
フラクタル図形とは、拡大/縮小すると同じような形が現れるような図形です。

ルール110

ルール110は周期的な状態とカオスの中間的な状態をとるクラス4に属する規則です。

rule110.png

周期性ができてしばらく続いて壊れる、といったのがみて取れると思います。このオーダーとカオスの中間的なダイナミクスは自然現象に多くみられることが知られ、またこのような領域の豊かなダイナミクスを利用して、チューリングマシンを模すこともできるそうです。

以上です。他のルールの図形はこの記事など、調べるといっぱいあります。実用的な例だとこの記事のように交通シミュレーションで使われることがあるようです。

参考文献

図解雑学 複雑系(今野紀雄 ナツメ社)

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
ログインすると使える機能について

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン
1