Erster Beitrag des Artikels über den Spielplatz-Adventskalender!
Unten [wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3 Zitiert aus% 83% A0). ~~ Ich denke, es ist einfacher zu verstehen, wenn Sie zum Link springen, als das folgende Zitat zu lesen w ~~
Im Lebensspiel wird der nachfolgende Zustand nur durch den Ausgangszustand bestimmt. Es gibt ein Gitter wie ein Go-Board, und ein Gitter wird als Zelle bezeichnet. Jede Zelle hat acht nahe gelegene Zellen. Jede Zelle hat zwei Zustände, "Leben" und "Tod", und der Zustand des nächsten Schritts (der nächsten Generation) einer Zelle wird durch den Zustand der umgebenden acht Zellen in der aktuellen Generation bestimmt.
Das Leben und der Tod einer Zelle folgen den folgenden Regeln.
Geburt Wenn genau drei lebende Zellen neben einer toten Zelle liegen, wird die nächste Generation geboren. ** Überleben ** Wenn zwei oder drei lebende Zellen neben einer lebenden Zelle liegen, überlebt sie in der nächsten Generation. ** Entvölkert ** Befindet sich weniger als eine lebende Zelle neben einer lebenden Zelle, stirbt diese aufgrund der Entvölkerung ab. ** Überfüllt ** Wenn sich 4 oder mehr lebende Zellen neben einer lebenden Zelle befinden, stirbt diese aufgrund von Überfüllung. Unten sehen Sie ein Beispiel für Leben und Tod im nächsten Schritt in der zentralen Zelle. Lebende Zellen sind mit ■ und tote Zellen mit □ gekennzeichnet.
import matplotlib.pyplot as plt
import numpy as np
n = 50
#Erstellen Sie eine zufällige Zelle
cells = np.random.randint(0, 2, (n, n), dtype=bool)
Durch zufällige Auswahl von "Wahr" oder "Falsch" wird eine n × n-Matrix von Elementen erstellt. ("Leben" für "Wahr", "Tod" für "Falsch") (Wenn Sie es auf ungefähr "n = 500" erhöhen, wird es schwer ...)
sum_around = lambda i, j : cells[max(0, i-1):i+2, max(0, j-1):j+2].sum() - cells[i, j]
Zuerst wird eine 3 × 3-Matrix, die auf der Spaltenkomponente "i" row "j" der Matrix zentriert ist, extrahiert und die Summe der Elemente der Matrix erhalten. Das Subtrahieren der Mitte vom Ergebnis ergibt die Anzahl der "rohen" Zellen neben der Spaltenkomponente "i" row "j". (Berechnet als "Wahr = 1, Falsch = 0")
Wenn Sie die Zelle links (oder höher) von der Zelle in der 0. Zeile (oder 0. Spalte) angeben möchten, auch wenn "i -1 = -1", "max (0, -1) = 0" Daher kann nur auf den Bereich innerhalb der Wand Bezug genommen werden. Python scheint in Ordnung zu sein, wenn der Index die Größe der Matrix überschreitet und ich für die n-te Zeile (oder n-te Spalte) nicht dasselbe tun musste.
def update(old):
sum_around = lambda i, j : cells[max(0, i-1):i+2, max(0, j-1):j+2].sum() - cells[i, j]
around = np.fromfunction(np.vectorize(sum_around), old.shape)
new = np.where(old , ((2 <= around) & (around <= 3)), (around == 3))
return new
Durch Einfügen der Funktion "sum_around" in das erste Argument der Funktion "np.fromfunction" wird eine neue Matrix "around" erstellt, in der ** der Wert jedes Elements = die Anzahl benachbarter "roher" Zellen ** ist. Wenn jedes Element "wahr" ist, dh wenn es eine "rohe" Zelle ist, wird das Beurteilungsergebnis von "Überleben / Entvölkerung / Überfüllung" zurückgegeben, und wenn es "falsch" ist, dh wenn es eine "Todeszelle" ist, wird das Beurteilungsergebnis zurückgegeben. Gibt das Urteilsergebnis von ** Geburt ** zurück. Der Rückgabewert ist vom Typ "bool", der so wie er ist die Zelle der nächsten Generation.
Es scheint, dass die Funktion des ersten Arguments eine universelle Funktion (ufunc) sein muss.
Parameters :
function : callable The function is called with N parameters, where N is the rank of shape. Each parameter represents the coordinates of the array varying along a specific axis. For example, if shape were (2, 2), then the parameters would be array([[0, 0], [1, 1]]) and array([[0, 1], [0, 1]]) numpy.fromfunction
Da das Argument der Funktion "sum_around" den Typ "int" annimmt, wird es mit "np.vectorize" ersetzt, damit es den Typ "ndarray" empfangen kann.
while True:
# for _ in range(200): #Wenn Sie die Anzahl der Male angeben möchten
cells = update(cells)
plt.imshow(cells)
plt.pause(.01) # 0.Alle 01 Sekunden aktualisiert
plt.cla() #Ohne dies wird es immer schwerer
from matplotlib.colors import LinearSegmentedColormap
colors = ['green', 'red']
xmas = LinearSegmentedColormap.from_list('xmas', colors)
norm = plt.Normalize(0, 1)
plt.tick_params(labelbottom=False, labelleft=False,
bottom=False, left=False)
Sie können zur angegebenen Farbe wechseln, indem Sie das Innere der while-Anweisung in "plt.imshow (Zellen, cmap = xmas, norm = norm)" ändern.
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
n = 15
cells = np.zeros([n, n], dtype=bool)
#Galaxis
cells[3:9, 3:5] = True
cells[3:5, 6:12] = True
cells[-5:-3, 3:9] = True
cells[6:12, -5:-3] = True
#zufällig
# cells = np.random.randint(0, 2, (n, n), dtype=bool)
def update(old):
sum_around = lambda i, j : cells[max(0, i-1):i+2, max(0, j-1):j+2].sum() - cells[i, j]
around = np.fromfunction(np.vectorize(sum_around), old.shape, dtype=int)
new = np.where(old , ((2 <= around) & (around <= 3)), (around == 3))
return new
colors = ['green', 'red']
xmas = LinearSegmentedColormap.from_list('xmas', colors)
norm = plt.Normalize(0, 1)
plt.tick_params(labelbottom=False, labelleft=False,
bottom=False, left=False)
# for _ in range(200):
while True:
cells = update(cells)
plt.imshow(cells, cmap=xmas, norm=norm)
plt.pause(.01)
plt.cla()
Es ist wahrscheinlich das erste Mal seit ich mit dem Programmieren angefangen habe, dass etwas, das ich selbst gemacht habe, funktioniert hat ... Ich habe es getan (dringende Rekrutierung: Verbalisierung der Freude)
Recommended Posts