ラングトンのアリ(GIF,python,numpy,matplotlib,ImageMagick)

毎日寝る前にイアン・スチュアートの「数学の秘密の本棚」という本を読んでいる。だいたい5ページぐらいで寝落ちする。

数学の秘密の本棚
数学の秘密の本棚
posted with amazlet at 15.05.28
イアン・スチュアート
ソフトバンククリエイティブ
売り上げランキング: 86,191

その中に「ラングトンのアリ」というトピックがあったのでGIFアニメを自分で作った。一言で言うと二次元平面の上をアリが移動するんだけど、色が白なら黒に、黒なら白に反転して、白の場合は左回転、黒の場合は右回転して一歩前に進むというゲーム。証明されているのかな?

ラングトンのアリ – Wikipedia

本当はmatplotlibのアニメーション作る機能でmp4を作り、moviepyでmp4をGIFアニメにしてたんだけど、処理が重すぎたのでImageMagickに投げて、あとコマを間引きして作った。ImageMagickでGIFアニメ作るときは-delayを適当に。

movie



# -*- coding: utf-8 -*-
# date: 2015/05/28
# author: @taki__taki__

# packages
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as ani

# parameters
X, Y, x0, y0 = 200, 200, 100, 100
max_iter = 50000

# direction (N0, E1, S2, W3)
class Direction(object):
def __init__(self, d):
self.d = d
def turn_right(self): self.d = (self.d + 1) % 4
def turn_left(self): self.d = (self.d – 1) % 4
def __str__(self):
if self.d == 0: return “N”
elif self.d == 1: return “E”
elif self.d == 2: return “S”
elif self.d == 3: return “W”
else: return “X”

def get_next(x, y, direction):
if direction.d == 0: return (x, y+1)
elif direction.d == 1: return (x+1, y)
elif direction.d == 2: return (x, y-1)
elif direction.d == 3: return (x-1, y)
else: return (x, y)

if __name__ == ‘__main__’:
# initialize the board
board = np.zeros((X, Y), dtype=np.bool)
direction = Direction(0)

# iteration
x, y, counter = x0, y0, 0
for i in range(max_iter):
if x >= X or y >= Y or x < 0 or y < 0: break # out of the board

# Black: turn right / White: turn left
if board[x][y]: direction.turn_right()
else: direction.turn_left()
board[x][y] = not board[x][y] # flip
x, y = get_next(x, y, direction) # move 1 step

if i % 300 == 0:
counter += 1
fig = plt.figure(figsize=(3,3))
ax = fig.add_subplot(111)
ax.imshow(board, interpolation='nearest', cmap='Greys')
ax.get_xaxis().set_ticks([]); ax.get_yaxis().set_ticks([])
plt.title("Langton's ant")
plt.savefig("pngtmp/png_%05d" % counter)
plt.close()
[/python]

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です