几十年前一位名叫克里斯托弗·兰顿的美国科学家发明了一个奇怪的游戏,他也是仿生领域领军人物之一。这个奇怪的游戏据说能在其中听到宇宙的心跳。这个游戏其实并不困难规则仅有两个,首先在一张白格纸上放上一只活的蚂蚁,如果蚂蚁在白色格子内,它就向右旋转90度后再将该白格改为黑色格子。按照游戏规则首条,前四步都必须改成黑色格子。
那么第二条规则来了,如果蚂蚁在黑色格子内,就向左旋转90度后,再将该方格改为白色格子。那么往下又会怎么样?若往下就会进入到一个很漫长的混乱期,我们暂且称之为混沌时代。
接下来将整个棋盘换成黑色,再把格子缩小一倍,这样是为了看得更加清楚。当蚂蚁走过11000步之后,奇怪的事情出现了,蚂蚁会按照一个104步的重复模式构筑一个无限循环的系统,假设所有格子无限大,蚂蚁就会无限重复走下去。后来人们给蚂蚁的路线起了个名字叫作高速公路。
下面用python写一个简单的代码演示这一过程:
import cv2
import numpy as np
im = np.ones((540,960),dtype=int) #白格子
def goahead(direction=-1+0j,position=5+3j):
global im
tr90 = 0-1j #turn right 90 degrees
tl90 = 0+1j #turn left 90 degrees
pos = int(position.imag),int(position.real)
WorB = im[pos] # white or black
im[pos] = 1 - WorB
newdirec = direction * (tr90 if WorB else tl90)
newpos = position + newdirec
return newdirec,newpos
def langton_ants(init_direc=-1+0j,init_pos=5+3j, steps=50):
direc,pos = init_direc,init_pos
for i in range(steps):
direc,pos = goahead(direc,pos)
def gen(N):
global im
im = np.ones((540,960),dtype=int) #白格子
direc,steps,loops = -1+0j,10000,N
for i in range(loops):
langton_ants(direc,480+270j,steps)
direc *= -1j
img = np.zeros((1080,1920,3),dtype="uint8")
for i in range(1080):
for j in range(1920):
img[i,j,2] = 255 if im[i>>1,j>>1]==0 else 0
cv2.imwrite("langton_ants_%d.png"%N,img)
if 1:
for i in range(1,100,5):
gen(i)