兰顿蚂蚁的python实现

几十年前一位名叫克里斯托弗·兰顿的美国科学家发明了一个奇怪的游戏,他也是仿生领域领军人物之一。这个奇怪的游戏据说能在其中听到宇宙的心跳。这个游戏其实并不困难规则仅有两个,首先在一张白格纸上放上一只活的蚂蚁,如果蚂蚁在白色格子内,它就向右旋转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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值