セルオートマトンを組んでシェルピンスキーのギャスケットを作る
この記事はこんな人にオススメです
  • セルオートマトンについて詳しく知りたい人
  • Pythonで数値計算をしたい人
  • カオスやフラクタル的なことがちょっと好きな人

こんにちは.
今日はセルオートマトンについての記事を書きます.

実際に,セルオートマトンのプログラムを回して挙動を確認しているので,
この記事を理解できたらそこそこ「セルオートマトン」に関しては大丈夫なのではないでしょうか.

スライドも作ったので,もし見たい方がいたらご覧ください

ってか名前かっこいいですよね.
セルオートマトン!!!(厨二感出てますが,,,)

解説動画

セルオートマトンとは!?

セルオートマトンとは,ある内部状態をもったセルが,周囲の内部状態をもったセルと相互作用(情報交換)して時間的に変化していくモデルです.

数理的にモデル化を行う上では,このような状態を考慮してモデルを組むと思います.

人間や生物の行動モデルにも使用される割とメジャーなモデル化です.
知っているとちょっといつか役に立つかもしれません.

数学的に言うと,一次元とか二次元とか色々ありますが,このように書けます.

セルの内部状態を更新する

各セルの内部状態を更新するアルゴリズムとしては,このような感じです.

プログラムについて

スライドで説明した1次元のオートセルマトンに関してのプログラムです.
(参考:Pythonによる数値計算とシミュレーション)

詳しく内部構造を理解したい人は,上記の参考資料(Pythonによる数値計算とシミュレーション)をオススメです!

# -*- coding: utf-8 -*-
import sys
import numpy as np
import matplotlib.pyplot as plt

N = 256
R = 8
MAXT = 256

def setrule(rule,ruleno):

    for i in range(0, R):
        rule[i] = ruleno % 2
        ruleno = ruleno // 2
        
    for i in range(R - 1, -1, -1):
        print(rule[i])

def initca(ca):

    line = input("各Cellの初期値を入力:")
    print()
    for no in range(len(line)):
        ca[no] = int(line[no])

def putca(ca):

    for no in range(N - 1, -1, -1):
        print("{:1d}".format(ca[no]), end="")
    print()

def nextt(ca,rule):

    nextca = [0 for i in range(N)]

    for i in range(1, N - 1):
        nextca[i] = rule[ca[i + 1] * 4 + ca[i] * 2 + ca[i - 1]]

    for i in range(N):
        ca[i] = nextca[i]

outputdata = [[0 for i in range(N)] for j in range(MAXT + 1)]

rule = [0 for i in range(R)]
ruleno = int(input("ルールは??:"))
if ruleno < 0 or ruleno > 255:
        print("ルールが正しくない(", ruleno, ")")
        sys.exit()
setrule(rule, ruleno)

ca = [0 for i in range(N)]
initca(ca)
putca(ca)
for i in range(N):
    outputdata[0][i] = ca[i]
    
for t in range(MAXT):
    nextt(ca, rule)
    putca(ca)
    for i in range(N):
        outputdata[t + 1][i] = ca[i]

plt.imshow(outputdata)
plt.show()

プログラムの結果に関して

ルールを18で回してみました.

このような感じになりました!
内側のルールが同様なので,どのような初期値から演算してもこのような形になります.

シェルピンスキーのギャスケットですね!!!笑

また,インターネットを見ると,ルール161で,シェルピンスキーのギャスケットが見られると言うことで実際に試してみました!

このようになりました笑

確かにところどころ,シェルピンスキーのギャスケットが見られる!
ちなみに,シェルピンスキーのギャスケットとは,フラクタル図形の一種です.
カオスがチラ見してますね

詳しくは,こちらのwikiを参考にして見てください!
(参考:シェルピンスキーのギャスケット)

以上の絵も,wikiから抜粋したシェルピンスキーのギャスケットです.
拡大しても拡大しても同じような絵が出てきますね!
数学の美を感じます!

では!