兰顿蚂蚁的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)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用pygame可以很容易地实现兰顿蚂蚁的模拟。下面是一个简单的示例代码: ```python import pygame import numpy as np # 初始化pygame pygame.init() # 设置窗口尺寸和标题 width, height = 800, 600 window = pygame.display.set_mode((width, height)) pygame.display.set_caption("Langton's Ant") # 定义颜色 BLACK = (0, 0, 0) WHITE = (255, 255, 255) # 定义兰顿蚂蚁的初始位置和方向 ant_pos = np.array([width // 2, height // 2]) ant_dir = np.array([0, -1]) # 初始方向向上 # 定义兰顿蚂蚁的移动规则 turn_right = np.array([[0, -1], [1, 0]]) turn_left = np.array([[0, 1], [-1, 0]]) # 创建一个二维数组来表示画布上每个像素的状态 grid_size = 5 grid = np.zeros((width // grid_size, height // grid_size)) # 游戏循环 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 更新兰顿蚂蚁的位置和方向 ant_pos[0] = (ant_pos[0] + ant_dir[0]) % (width // grid_size) ant_pos[1] = (ant_pos[1] + ant_dir[1]) % (height // grid_size) ant_dir = np.dot(ant_dir, turn_right if grid[ant_pos[0], ant_pos[1]] == 0 else turn_left) # 更新当前像素的状态 grid[ant_pos[0], ant_pos[1]] = 1 - grid[ant_pos[0], ant_pos[1]] # 绘制画布 window.fill(BLACK) for x in range(width // grid_size): for y in range(height // grid_size): if grid[x, y] == 1: pygame.draw.rect(window, WHITE, (x * grid_size, y * grid_size, grid_size, grid_size)) pygame.display.flip() # 退出pygame pygame.quit() ``` 这段代码使用numpy库来处理数组,使用pygame库来进行图形绘制。在游戏循环中,首先更新兰顿蚂蚁的位置和方向,然后根据当前像素的状态更新该像素的状态,最后绘制画布。 运行以上代码,你将看到一个兰顿蚂蚁在窗口中移动并改变像素的状态。你可以尝试修改代码来调整窗口大小、格子的大小、兰顿蚂蚁的初始位置和方向等参数,以实现你想要的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值