Я написал код муравья Лэнгтона и хотел, чтобы анимация запускалась в Colab до тех пор, пока она не будет остановлена пользователем или после определенного количества кадров.Как и сейчас, он сначала генерирует все кадры, затем компилирует их в анимацию и затем отображает.Если есть много кадров, это занимает вечность и / или Colab исчерпывает память.Вот почему я надеялся, что есть способ просто сгенерировать его по одному кадру за раз и постоянно обновлять изображение.Не похоже, что у FuncAnimation есть такая возможность, но, может быть, я просто ее не вижу.Если кто-нибудь знает способ или документацию, которая будет полезна, пожалуйста, дайте мне знать.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation, rc, colors
from IPython.display import HTML
N = 40
ant = np.array([N//2, N//2])
move = {'N': [0, 1], 'E': [1, 0], 'S': [0, -1], 'W': [-1, 0]}
d = ['N', 'E', 'S', 'W']
facing = 1
board = np.zeros((N, N))
color = 0
board[ant[0]][ant[1]] = 4
cmap = colors.ListedColormap(['darkgreen', 'limegreen', 'greenyellow', 'yellow', 'red'])
def turn(direction):
if direction == 'R':
return (facing + 1) % 4
else:
return (facing - 1) % 4
def update(data):
global ant, board, facing, color
if color in [0, 1]:
facing = turn('R')
else:
facing = turn('L')
board[ant[0]][ant[1]] = (color + 1) % 4
ant += move[str(d[facing])]
color = board[ant[0]][ant[1]]
board[ant[0]][ant[1]] = 4
mat.set_data(board)
return [mat]
fig, ax = plt.subplots(figsize=(5, 5));
ax.grid(False)
plt.axis('off')
mat = ax.matshow(board, cmap=cmap)
ani = animation.FuncAnimation(fig, update, frames = 150, interval = 1, repeat=False, blit=True)
rc('animation', html='jshtml')
ani