Lebensspiel mit Python! (Conways Spiel des Lebens)

Einführung

[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!

lifegame.py

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
>>> ...

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()

Beispielcode mit matplotlib

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 ...

Beispielcode

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)

Stand der Zeichnung

![lifegame-pulsar.png][link03]

Zukunftspläne?

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

Lebensspiel mit Python! (Conways Spiel des Lebens)
Implementierung eines Lebensspiels in Python
Leuchtendes Leben mit Python und OpenCV
Erste Schritte mit Python Grundlagen von Python
Othello-Spieleentwicklung mit Python
10 Funktionen von "Sprache mit Batterie" Python
Implementierung der Dyxtra-Methode durch Python
Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Sugoroku-Spiel und Zusatzspiel mit Python
Grundlegendes Studium von OpenCV mit Python
Lebensspiel mit Python [ich habe es geschafft] (auf Terminal & Tkinter)
Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"
Grundlagen der binärisierten Bildverarbeitung durch Python
[Beispiel für eine Python-Verbesserung] Python mit Codecademy lernen
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Führen Sie das Python-Skript mit TS-220 cron aus
Überprüfen Sie die Existenz der Datei mit Python
Verstopft mit Python-Update der GCP-Konsole ①
Einfache Einführung der Spracherkennung mit Python
UnicodeEncodeError hat Probleme mit der Standardausgabe von Python3
1. Mit Python 1-3 gelernte Statistiken. Berechnung verschiedener Statistiken (Statistiken)
Zeichnen mit Matrix-Reinventor von Python Image Processing-
Empfehlung von Altair! Datenvisualisierung mit Python
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Vergleich der Matrixtranspositionsgeschwindigkeit durch Python
FizzBuzz in Python3
Scraping mit Python
Statistik mit Python
Scraping mit Python
Python mit Go
Twilio mit Python
Spielen Sie mit 2016-Python
Getestet mit Python
Grundlagen von Python ①
Nützlich für den Alltag !? Halbautomatisierung der stärksten experimentellen Planungsmethode von COSPA mit Python
Kopie von Python
mit Syntax (Python)
Bingo mit Python
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Einführung von Python
Mit Python besetzen
[AtCoder] Lösen Sie ein Problem von ABC101 ~ 169 mit Python
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
Bereiten Sie die Ausführungsumgebung von Python3 mit Docker vor
Automatischer Betrieb von Chrome mit Python + Selen + Pandas
Leistungsvergleich des Gesichtsdetektors mit Python + OpenCV
[Python] Grenzachse des 3D-Graphen mit Matplotlib
2016 Todai Mathematik mit Python gelöst
[Hinweis] Exportieren Sie das HTML der Site mit Python.
Verstopft mit Python-Update der GCP-Konsole ② (Lösung)