[Lebensspiel] [link01], das als Zellautomat bekannt ist, schien interessant zu sein, deshalb habe ich den Code geschrieben, um das Kartenarray des Lebensspiels mit Python und Numpy zu generieren. Durch Angabe eines Kartenarrays der frühen Generation, das in "0" (tot) und "1" (live) geschrieben ist, wird es als Generator implementiert, um das Kartenarray der nächsten Generation iterativ zu generieren. Ich habe auch versucht, die Karte der periodischen Randbedingung (dem Zustand, in dem die Enden verbunden sind) zu entsprechen!
Importieren und verwenden Sie die folgende lifegame.py
als Modul. Im Beispielcode unten finden Sie ein Beispiel für die tatsächliche Verwendung. Die Evolutionsregeln basieren auf dem "23/3" von Wikipedia, aber Sie können sie leicht ändern, indem Sie den Code anpassen.
usage
>>> lg_map = lifegame.MapGenerator(map_init, periodic=False)
>>> lg_map.evolve()
array([...]) #Kartenarray der 0. Generation(= map_init)
>>> lg_map.evolve()
array([...]) #Kartenarray der 1. Generation
>>> ...
map_init
: Kartenarray der frühen Generation (list oder numpy.ndarray)periodic
: Gibt an, ob periodische Randbedingungen für die Karte verwendet werden sollen (bool)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()
Unten finden Sie einen Beispielcode für einen Oszillatortyp namens [Pulsar] [link02], der sich auf einer 15x15-Karte endlos weiterentwickelt. Da es sich nur um ein Beispiel handelt, scheint es eher durch die Zeichnungseffizienz von matplotlib als durch die Berechnungsgeschwindigkeit des Arrays begrenzt zu sein ...
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]
Im Moment ist es notwendig, das Kartenarray der frühen Generation im Voraus im Text vorzubereiten, daher möchte ich matplotlib.widgets
verwenden, damit das Kartenarray vom Bildschirm aus eingegeben werden kann. Es ist ein Stück, also ist es unentschlossen, wann es gemacht werden soll (lacht)
[link01]: http://ja.wikipedia.org/wiki/Life Spiel [link02]: http://ja.wikipedia.org/wiki/Pulsar_ (Lebensspiel) [link03]: https://qiita-image-store.s3.amazonaws.com/0/44000/18e4ac52-9120-dae6-b683-8ca29cd1d507.png
Recommended Posts