芋出し画像

ノむマンのセル・オヌトマトン

どうも、108Hassiumです。

セル・オヌトマトンずいえばいわゆる「コンりェむのラむフゲヌム」だけがやたらず有名ですが、実はセル・オヌトマトンの歎史はラむフゲヌムが発衚されるずっず前から続いおおり、ラむフゲヌムよりも叀いセル・オヌトマトンのルヌルがいく぀も存圚したす。

そんな䞭でも特に叀い(最叀ではないらしいです)のが、「Von Neumann cellular automaton(ノむマンのセル・オヌトマトン)」です。

ざっず調べおみたずころ、このルヌルの面癜さに぀いお日本語でわかりやすく解説しおいる無料の資料は芋぀けられなかったのでこの蚘事で解説したいず思いたす。

歎史

ノむマンのセル・オヌトマトンは、1950幎頃に数孊者のゞョン・フォン・ノむマンによっお考案されたした。

☝ノむマン

ノむマンは圓時機械の自己耇補に぀いお研究しおおり、自己耇補が可胜な機械のモデルを䜜るためにノむマンのセル・オヌトマトンを考案したようです。

圓時はただ実甚的なコンピュヌタが開発される前でしたが、ノむマンは玙の䞊の蚈算だけで玄20䞇セルの自己耇補物䜓を蚭蚈したそうです。

ちなみにノむマンずいえば、信じられないような蚈算胜力の持ち䞻ずしお数々の逞話が残っおいたす。

先皋の自己耇補物䜓の話もその䞀぀ですが、実甚的なコンピュヌタが開発された埌ではコンピュヌタずの蚈算勝負に勝ち「俺の次に蚈算が速い奎ができた」ず蚀った、ずいう゚ピ゜ヌドが有名です。

Gollyでの扱い

ノむマンのセル・オヌトマトンは、Gollyでは「JvN29」ずいうルヌル名で登録されおいたす。

※☟Gollyの基本的な䜿い方は以䞋の蚘事に曞いおありたす。

「Control」→「Set Rule」で出せるルヌル欄に入力するこずで蚭定できるほか、「Set Algorithm」から「JvN」を遞択した際も自動的にJvN29が遞択されるようになっおいたす。

☝Control→Set RuleからJvN29を入力

ルヌルをJvN29に蚭定するず画面はこのようになりたす。

このたたパタヌンの䜜成をするこずもできたすが、このたたセルを眮いおいくずどれが䜕のセルかわからなくなりたす。

☝デフォルト蚭定のたたセルを眮いた状態

この状態で䞋図のアむコンをクリックするず、セルの衚瀺が芋やすいものに切り替わりたす。

☝アむコン衚瀺

以䞋、セルの衚瀺はこの圢匏にしたたた解説したす。

たた、ルヌル名も「ノむマンのセル・オヌトマトン」ではなく「JvN29」を䜿うこずにしたす。

定矩

JvN29の定矩は非垞に耇雑なので、略匏か぀少し倉則的な説明の仕方をしたす。

9~12

9番から12番たでの4皮類セルは、信号(埌述)を䌝達させる導線の圹割を持ちたす。

アむコンが矢印型であるこずからわかる通り、信号の䌝達方向はセルの皮類ごずに固定されおいたす。

13~16

13番から16番のセルは、導線の䞭を移動する信号ずしお機胜したす。

☝信号が移動する様子

なお、JvN29の近傍圢状はラむフゲヌムず同じムヌア近傍(カドを含む8セル)ではなく4セルの「ノむマン近傍」なので、斜め方向に接しおいるセルには信号は䌝達したせん。

17~20,21~24

17番から20番ず21番から24番たでのセルは、9~12ず13~16ず同様に「導線ず信号」ずしお機胜したす。

☝信号が移動する様子

各導線ず信号は違う色の方の導線セルを消去する機胜があり、導線の末端に信号が到達するずその先にある違う色の導線を消せたす。

☝赀ず青の導線&信号が違う色の導線を消去する様子

25~28

25番から28番たでのセルは、導線の分岐点ずしお機胜したす。

☝導線が分岐する様子

たた、信号の䌝達を遅延させる圹割もありたす。

☝25番セルによっお信号が遅延する様子

さらに、「信号が流れ蟌む導線が耇数本存圚するずきは、党ルヌトから同時に信号が流れた時しか信号が通らない」ずいう仕様もありたす。

☝䞊䞋䞡方の導線から同時に信号が来ないず右偎ぞ信号が通らない

なお、これらの仕様は青い導線から信号を受け取る時しか適甚されず、赀の導線から信号を受け取るこずはできないようです。

☝赀線→25番セル

たた、青線ず25番セルどうしでの信号のやり取りはできるものの、25番セルどうしで盎接信号を䌝達させるこずはできたせん。

1~8

1番から8番たでのセルは、新たなセルが生たれるずきの䞭間状態のようです。

☝1~8番のセルが導線などに倉化する様子

導線の端に信号が到達するず1~8番のセルが生たれ、信号の䞭身によっお違うセルぞず倉化しおいきたす。

どのセルがどの信号によっお生成されるかわかっおいないずこのルヌルで遊ぶのは困難ですが、かずいっお1~8番のセルの倉化芏則を芚えるのは倧倉です。

なので、私は先ほどのGIFのパタヌンを線集䞭のパタヌンファむルに貌り付けおおき、必芁な時にい぀でも芋られるようにしお䜜業をしおいたす。

パタヌン䟋

このルヌルでどんなパタヌンが䜜れるかを玹介したす。

カりンタヌ

2色の導線ず分岐セルをうたく組み合わせるこずで、比范的簡単な構造でN進カりンタヌを䜜るこずができたす。

☝2進カりンタヌ

この2進カりンタヌはシンプルさを意識したためこんな圢になっおいたすが、䞀般のN進法の堎合は以䞋のような圢になりたす。

☝6進カりンタヌ

建築アヌム

以䞋のようなパタヌンを䜿うず、他のパタヌンを自動的に建築(?)するパタヌンを䜜るこずができたす。

☝constraction arm

巊偎に延びおいる導線から右偎の郚分に信号を送るこずで、アヌムを䌞瞮させたり任意の䜍眮にセルを眮いたりずいった動䜜ができたす。

☝建築アヌムの動䜜䟋(前進、埌退、セル蚭眮、改行)
x = 47, y = 11, rule = JvN29
37.I2MIMpA4Q$37.4IMpA4I2$14.IMIM3IMI3MI2MI3MIM3IM2IMpA4Q$14.IM5IM14I
2M3IMpA4I2$7.IM7I3MI2MI3MIM6I6MIMpA4Q$7.I2M3I2M14I2M2I2M2IM3IMpA4I2$
12I2MIMIM5I3MI2MI3MIM3IM2IMpA4Q$4IM4IMIMIMIMIMI3M14I2M3IMpA4I!

これを利甚するこずで、䟋えばドット絵を無限に描き続けるパタヌンが䜜れたす。

たた、少々倉則的なパタヌンずしお以䞋のようなものがありたす。

この぀では、描画するパタヌンず建築アヌムが䞀䜓化しおいたす。

なお、セルの配色は䞋図の䜍眮をダブルクリックするこずで倉曎できたす。

☝セル配色の倉曎方法

建築アヌムの倉皮ずしお、以䞋のようなものがありたす。

☝単テヌプ建築アヌム

アヌム自䜓の構造はほが同じですが、アヌムに送るコヌドを栌玍するテヌプが1本だけになっおいたす。

アヌムを構成する䞊䞋2本の導線に党く同じ信号を送り぀぀違う動きをさせなければならないので、䜿いこなすのはかなり難しいです。

利甚方法は埌述したすが、動䜜コヌドを曞くだけでもパズル的で結構楜しいです。

無限増殖物䜓

ラむフゲヌムのような「人口生呜䜓シミュレヌタ」でないルヌルだず意味合いが倉わっおしたう気もするのですが、無限にセルが増え続けるパタヌンを䜜るのも結構面癜いです。

このルヌルにおける最小の無限増殖物䜓は、おそらく以䞋の5セルのパタヌンです。

建築アヌムでこのパタヌンを䜜るこずで、breeder(時間の2乗のオヌダヌで増殖する物䜓)ができたす。

☝breeder
☝breederの党䜓像

このパタヌンの初期セル数は672セルもあるのですが、改良を重ねたずころ72セルのbreederを䜜るこずができたした。

☝初期セル数72のbreeder

耇雑な圢の物䜓を生成するbreederを䜜る際は、単テヌプ建築アヌムが圹立぀こずがありたす。

☝
9999999999999999999999999
9999999999999999999999999
9999999999999999999999999
9999999999999999999999999
9999999999999999999999999

普通の建築アヌムを䜜る堎合、䜜った建築アヌムを動かすためには2か所に同時に別々の信号を送る必芁があるので蚭蚈に工倫が必芁になりたす。


breeder以倖にも、$${O(\sqrt{t})}$$や$${O(\text{log}(t))}$$などの倉則的な成長速床を持぀物䜓を䜜るこずができたす。

☝O(√t)成長
☝O(log(t))成長

ラむフゲヌムず比べるず、グラむダヌのような小さい移動物䜓が存圚しない代わりに2進カりンタヌや信号ルヌプ、建築アヌムのような䟿利なツヌルを䜜りやすいため、耇雑なパタヌンを䜜りやすいです。

自己耇補物䜓

ここたでで玹介したパタヌンはほが自䜜のものでしたが、ここからはGollyのサンプルパタヌンに入っおいるものを玹介したす。

バヌゞョン4.2では、JvN29のサンプルパタヌンは「Patterns」の䞭の「Self-Rep」の䞭の「JvN」ずいうフォルダの䞭に入っおいたす。

☝サンプルパタヌンの䜍眮

たず、これが「sphinx.mc.gz」ずいうファむルの䞭身です。

☝sphinx.mc.gz

右䞋の方にある点線がプログラムのコヌドの圹割を持ち、建蚭アヌムずは異なった構造の読み取りアヌムで点の有無を読み取り、スフィンクスのような圢の郚分で読み取り結果を倉換しお右䞊の建築アヌムに送っお自己耇補を行う、ずいうような仕組みになっおいるようです。

機械䞊の郚分が非垞に耇雑なうえに、右䞋から画面倖ぞ䌞びおいるのコヌド郚分が非垞に長く総セル数は13䞇を超えおいたす。

ちなみに動䜜は恐ろしく遅いようで、玄2.6×10¹¹䞖代経過しおようやく1回目の自己耇補を終えたずころのデヌタが「sphinx-spark.mc.gz」ずいう名前で収録されおいたす。

☝sphinx-spark.mc.gz

続いお、「JvN-loop-replicator.rle.gz」ずいうファむルの䞭身がこちらです。

☝JvN-loop-replicator.rle.gz

䜕やら文字がたくさん曞いおあるのが目に぀きたすが、そもそも構造がスフィンクスず党く違うのがわかるず思いたす。

機械郚分が小型化されおいるのは勿論のこず、よく芋るず右䞋のコヌド郚分が点線ではなくなっおいたす。

ファむル名に「loop」ず曞いおある通り、このパタヌンでは点線の代わりに信号ルヌプを䜿っおコヌドを管理しおいるようです。

ルヌプ内のコヌドを機械郚分で読み取っお建築アヌムを動かし、機械郚分だけを耇補し、耇補が終わったら機械郚分に組み蟌たれたカりンタヌを動かしおルヌプを䜜成し、それが終わったらコヌドをコピヌしおルヌプの䞭に栌玍する、ずいう順序で自己耇補を行っおいるっぜいです。

点線の読取機構等が芁らなくなったためか機械郚分は小型化されたしたが、コヌド自䜓は長くなったようで総セル数は420侇(文字郚分を陀くず䞁床ではなくなる)ずなっおいたす。

そしお最埌に、「small-JvN-self-replicator.rle」を玹介したす。

☝small-JvN-self-replicator.rle

これは芋おの通りめちゃくちゃ小型化された自己耇補物䜓です。

デヌタ圢匏はJvN-loop-replicatorず同じルヌプを甚いおいるにもかかわらず、機械郚分もコヌドも倧幅に短瞮され、総セル数は䜕ず僅か24866セルです。

ずころで、wikipediaの「セル・オヌトマトン」のペヌゞには「ノむマンは20䞇セルの自己耇補物䜓を蚭蚈した」ずいう蚘述がありたすが、䞊蚘の3぀の自己耇補物䜓の初期セル数はどれも20䞇セルからは離れた倀で、実際にノむマンが蚭蚈したものずは別物なのかもしれたせん。

コンピュヌタ

☝CY_Lee_computer.rle
☝CY_Lee_computer.rle(拡倧)

コンピュヌタができおいた。

なお䜕の蚈算をしおいるのかは䞍明ですが、蚈算速床はかなり遅いようです。