最初写这段代码是为了2019华为软件精英挑战赛准备,熟悉元胞自动机用。最终发现并没有留给我写判题器的时间。但这段代码还是保留下来了,存储gif的部分借鉴了别的博客,不过已经找不到原文了。这段代码写的不是很好,在我的电脑上运行很慢(还是自己优化水平太差),也算自己独立实现的,放在博客上自省。
生命游戏实现
生命游戏的规则可参考:生命游戏简介及算法分析(整理)
代码中可对burn、live、init、detector参数进行修改,采用不同规则进行生命游戏。
代码
# -*- coding: utf-8 -*-
import numpy as np
from numpy.linalg import cholesky
import matplotlib.pyplot as plt
from scipy import signal
from scipy import misc
from matplotlib import animation
import time
import copy
def update_cell(init, surrounding, burn, live):
for i in range(0, init.shape[0]):
for j in range(0, init.shape[1]):
if(init[i][j] and (surrounding[i][j] < live or surrounding[i][j] > burn)):
init[i][j] = not init[i][j]
elif(not init[i][j] and surrounding[i][j] == burn):
init[i][j] = not init[i][j]
return init
def dominoes_six(height=50, width=50):
init = np.zeros((height, width))
x = int(height/2-1)
y = int(width/2-2)
init[x][y] = 1
init[x][y+1] = 1
init[x+1][y+1] = 1
init[x+1][y+2] = 1
init[x+2][y+2] = 1
init[x+1][y+3] = 1
return init
def dominoes_line(height=50, width=50):
init = np.zeros((height, width))
init[int(height/2), 20:-20] = 1
init[20:-20, int(width/2)] = 1
return init
def normal_detector():
detector = np.array([[1, 1, 1],
[1, 0, 1],
[1, 1, 1]])
return detector
def animate(init, detector, step, burn, live):
pic3 = np.empty(shape=[0, init.shape[0], init.shape[1]], dtype=int)
pic4 = np.empty(shape=[0, init.shape[0], init.shape[1]], dtype=int)
res = copy.copy(init)
for i in range(0, step):
surrounding = signal.convolve2d(res, detector, boundary='fill', mode='same')
res = update_cell(res, surrounding, burn, live)
pic3 = np.append(pic3, np.expand_dims(surrounding, axis=0), axis=0)
pic4 = np.append(pic4, np.expand_dims(res, axis=0), axis=0)
return pic3, pic4
def game_of_life(init=dominoes_six(), burn=3, live=2, detector=normal_detector(), step=10):
pic3, pic4 = animate(init, detector, step, burn, live)
fig = plt.figure()
ax1 = fig.add_subplot(221)
plt.imshow(init, cmap='gray')
ax2 = fig.add_subplot(222)
plt.imshow(detector, cmap='gray')
def update_pic(i):
ax3 = fig.add_subplot(223)
plt.imshow(pic3[i])
ax4 = fig.add_subplot(224)
plt.imshow(pic4[i], cmap='gray')
ani = animation.FuncAnimation(fig, update_pic, frames=step, blit=False, interval=10, repeat=False)
ani.save('D:/data/gif/GameofLife_4.gif', writer='pillow', fps=15)
plt.show()
if __name__ == '__main__':
burn = 3
live = 2
init = dominoes_line(71, 71)
detector = normal_detector()
game_of_life(init, burn, live, detector, 200)
print("done")