1. Langtonの蟻とは?
Langtonの蟻とはアメリカの計算機科学者で、"Artificial Life" という用語を生み出したChristopher Langtonが発明した単純な二次元チューリングマシンのことです。簡単に言えば、何種類かの色で塗られた格子状を蠢く蟻が、自分の乗っているマス目の色に応じて格子状の色を変化させながら進んでいくシミュレーションです。一番単純なものは次のルールで動きます:
-
白いマスにアリがいた場合、90°右に方向転換し、そのマスの色を反転させ、1マス前進する。
-
黒いマスにアリがいた場合、90°左に方向転換し、そのマスの色を反転させ、1マス前進する。
ここで、色を白→黒→白 に限らず他の状態を追加したり、回転角度を変更したりすることによって、違った振る舞いを見せます。色の変化がサイクリックに定義され拡張されたLangtonの蟻はそのサイクリックな色の並びで右に行くか左に行くかに応じてそれぞれR、Lを並べて表現されます。例えば、この記法では上記のルールがRLRと表記されます。最後のRは1つ目に戻ることを意味していることに注意してください。
2. 方法
プログラミング初心者でよくわからないので、以下のサイトから大枠を拝借させていただきました:
こちらのコードはturtle graphicsというライブラリを用いてpythonで記述されています。単純な動きを繰り返す図形の描画に向いているプログラムなので、Langtonの蟻をシンプルに記述することができます。
3. コード
import turtle
def langton():
# Initializing the Window
window = turtle.Screen()
window.bgcolor('white')
window.screensize(1000,1000)
# Contains the coordinate and colour
maps = {}
# Initializing the Ant
ant = turtle.Turtle()
# shape of the ant
ant.shape('square')
# size of the ant
ant.shapesize(0.5)
# speed of the ant
ant.speed('fastest')
# gives the coordinate of the ant
pos = coordinate(ant)
arg = input("Input the type of the ant: ")
step = 10
i = 0
if arg == "RL":
while True:
i= i + 1
print(i)
if pos not in maps or maps[pos] == "white":
pos = turn(maps, pos, ant, "black", step, 270)
elif maps[pos] == "black":
pos = turn(maps, pos, ant, "white", step, 90)
elif arg == "RLU":
while True:
i= i + 1
print(i)
if pos not in maps or maps[pos] == "white":
pos = turn(maps, pos, ant, "black", step, 270)
elif maps[pos] == "black":
pos = turn(maps, pos, ant, "red", step, 90)
elif maps[pos] == "red":
pos = turn(maps, pos, ant, "white", step, 180)
if arg == "RRLL":
while True:
i= i + 1
print(i)
if pos not in maps or maps[pos] == "white":
pos = turn(maps, pos, ant, "black", step, 270)
elif maps[pos] == "black":
pos = turn(maps, pos, ant, "red", step, 270)
elif maps[pos] == "red":
pos = turn(maps, pos, ant, "blue", step, 90)
elif maps[pos] == "blue":
pos = turn(maps, pos, ant, "white", step, 90)
def invert(graph, ant, color):
graph[coordinate(ant)] = color
def coordinate(ant):
return (round(ant.xcor()), round(ant.ycor()))
def turn(graph, position, ant, post_color, step, degree):
ant.fillcolor(post_color)
invert(graph, ant, post_color)
ant.stamp()
ant.left(degree)
ant.forward(step)
position = coordinate(ant)
return position
langton()
4. コードの内容
このコードではRLの他、RLBとRRLLを実装しました。
ステップ6200くらいでのRLはこのようになりました。この蟻は結構頑張り屋さんで、陣地をじわじわと広げていく様が面白いです。
ステップ2300くらいのRRLLは以下の鬼の仮面みたいなのが出てきました。この蟻はとても慎重で、まるでなるべく左右対称性を崩さないように努力しているかのように見えます。
以下がステップ900ぐらいのRLUです。待てど暮らせどちっこいスペースでちまちま動き回り続けるなんとも謙虚なこの蟻は休日にベッドから離れられない私の姿とそっくりです。
5. 他の蟻
今回の例には出てきませんでしたが、しばらく待つと真ん中の方でいじけていた蟻が突然一念発起したかのように一方向に向かって突進しだすことがあるようです。これはRLUがそうだったように繰り返しのパターンができるときに発生します。RLUと違い例えばRLRLRLRL...のようにある方向に進み続けるような対称性の時蟻は道を作り出します。また、今回は縦と横の4方向のみにしか動かないものしか見てきませんでしたが、斜めに移動させたり蟻を六角形にしたりするとまた面白いことが起こるようです。
6. まとめと展望
pythonでLangtonの蟻を書くと、かなりシンプルなコードで動かせて楽しかったです。しかし、やはりステップが進むのが遅すぎてだんだん飽きてしまうので何とか早くできる方法を見つけ、もっと複雑な蟻を作ったりしてみたいです。また、これを見ていると月並みながらも生物は複雑化されたLangtonの蟻でしかないのではないかという考えに取りつかれました。たまにはいつもの習慣を変えてRLからRLLの蟻になってみると、大きな違いが現れるかもしれません。