[Life game] [link01], qui est connu comme un automate à cellules, semblait intéressant, j'ai donc écrit le code pour générer le tableau de cartes du jeu de la vie avec Python et numpy. En donnant un tableau de carte de première génération écrit en «0» (mort) et «1» (en direct), il est implémenté en tant que générateur pour générer le tableau de carte de prochaine génération en itératif. J'ai aussi essayé de faire correspondre la carte à la condition aux limites périodique (l'état où les extrémités sont connectées)!
Importez et utilisez le lifegame.py
suivant comme module. Consultez l'exemple de code ci-dessous pour un exemple d'utilisation réel. Les règles d'évolution sont basées sur le «23/3» présenté sur Wikipédia, mais vous pouvez facilement les modifier en modifiant le code.
usage
>>> lg_map = lifegame.MapGenerator(map_init, periodic=False)
>>> lg_map.evolve()
array([...]) #Tableau de carte de 0e génération(= map_init)
>>> lg_map.evolve()
array([...]) #Tableau de carte de 1ère génération
>>> ...
map_init
: Tableau de cartes de la première génération (liste ou numpy.ndarray)Periodic
: Indique s'il faut utiliser des conditions aux limites périodiques pour la carte (booléen)lifegame.py
lifegame.py
import numpy as np
from itertools import product
class MapGenerator(object):
def __init__(self, map_init, periodic=False):
self.map_init = np.array(map_init, np.int64)
self.periodic = periodic
self.generator = self.map_evolver()
def map_evolver(self):
map_now = self.map_init
map_shape = self.map_init.shape
while True:
map_next = np.zeros_like(map_now, np.int64)
for (i,j) in product(range(map_shape[0]), range(map_shape[1])):
islive = bool(map_now[i,j])
nlive = self.num_live_neighbours(map_now, i, j)
# write the rules of lifegame here!
# ........................................
if nlive == 2:
if islive: map_next[i,j] = 1
elif nlive == 3:
map_next[i,j] = 1
# ........................................
yield map_now
map_now = map_next
def num_live_neighbours(self, map_now, i, j):
if self.periodic:
neighbours = np.roll(np.roll(map_now, -i+1, 0), -j+1, 1)[:3,:3]
else:
sl_i = slice(0,i+2) if i == 0 else slice(i-1,i+2)
sl_j = slice(0,j+2) if j == 0 else slice(j-1,j+2)
neighbours = map_now[sl_i,sl_j]
return neighbours.sum() - map_now[i,j]
def evolve(self):
return self.generator.next()
Voici un exemple de code d'un type d'oscillateur appelé [Pulsar] [link02] qui évolue à l'infini sur une carte 15x15. Comme il ne s'agit que d'un échantillon, il semble qu'il soit limité par l'efficacité de dessin de matplotlib plutôt que par la vitesse de calcul du tableau ...
pulsar.py
import time
import numpy as np
import matplotlib.pyplot as plt
import lifegame
pulsar = np.array([
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
lg_map = lifegame.MapGenerator(map_init=pulsar, periodic=False)
plt.ion()
while True:
plt.pcolormesh(lg_map.evolve())
plt.xlim([0, pulsar.shape[1]])
plt.ylim([0, pulsar.shape[0]])
plt.draw()
plt.clf()
time.sleep(0.05)
![lifegame-pulsar.png][link03]
Pour le moment, il est nécessaire de préparer à l'avance le tableau de la carte de la première génération dans le texte, donc je voudrais utiliser matplotlib.widgets
pour que le tableau de la carte puisse être entré à partir de l'écran. C'est une pièce, donc il est indécis quand le faire (rires)
[link01]: http://ja.wikipedia.org/wiki/Life jeu [link02]: http://ja.wikipedia.org/wiki/Pulsar_ (jeu de la vie) [link03]: https://qiita-image-store.s3.amazonaws.com/0/44000/18e4ac52-9120-dae6-b683-8ca29cd1d507.png
Recommended Posts