Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ws1314:cellulaere_automaten [2014/02/13 14:34] Jimmendorf |
ws1314:cellulaere_automaten [2016/05/10 14:46] (aktuell) |
||
---|---|---|---|
Zeile 78: | Zeile 78: | ||
Zielvorstellungen: die richtige Regel, | Zielvorstellungen: die richtige Regel, | ||
- | <code python> | + | der untenstehende Code ist der Grundbaustein zur Forschungsreihe an unserem "finalen" Automaten. |
+ | Wir haben uns, inspiriert vom Artikel "Emergence of Macro Spatial Structures in Dissipative Cellular Automata" von Andrea Rolli und Franco Zambonelli, dazu entschieden uns mit sogenannten "Dissipativen Zellulären Automaten" zu beschäftigen. | ||
+ | Diese bieten sich an, da | ||
+ | (1) wir uns im Vorfeld, durch Implementierung von "Game of Life" technisch gut auf diese Klasse von Zweidimensionalen CA's vorbereitet haben und (2) wir durch die diskussion der Berlusov-Zhabotinski-Reaktion und anderer "dissipativer Strukturen" auch theoretische Grundlagen haben. | ||
- | import numpy as np | + | Wir möchten speziell vollkommen diskrete DCA's erforschen, da für uns einer der faszinierensten Aspekte von CA's es ist aus der vermeintlichen einfachheit von 1 und 0 nahezu unbegränzte Komplexität emergieren zu lassen. |
- | import matplotlib.pyplot as plt | + | |
- | x = 10 | + | Wie wir bisher die Struktur diskreter DCA's verstanden haben und implementieren wollen, ist die folgende: |
- | y = 10 | + | |
+ | eine 2-dimensionale Welt wird durch zufälliges Anordnen von 'lebenden' und 'toten' diskreten Zellen erzeugt. | ||
+ | |||
+ | Nun gibt es ein 'innere' Verhaltensweise (UpdateRegel) der Zellen, die asynchron pro diskretem Zeitschritt, eine einzelne Zelle updated. Diese Regel wird, ungestört, zu einem equilibralen Zustand der Welt führen. | ||
+ | |||
+ | Weiterhin gibt es einen zweiten 'äußeren' Einfluss (UpdateRegel) der 'Umwelt', der durch paralleles, ebenfalls asynchrones updaten einzelner Zellen, die 'innere' Regel stört und so das System vom Equilibrium 'fernhält'. | ||
+ | |||
+ | Wir interessieren uns insbesondere für das Verhältniss der beiden parallelen updatefunktionen und deren Einfluss auf die räumliche Anordnung der Zellen des Systems. | ||
+ | |||
+ | | ||
+ | <code python> | ||
+ | import numpy as np | ||
+ | import matplotlib.pyplot as plt | ||
+ | |||
+ | x = 50 | ||
+ | y = 50 | ||
+ | |||
def setup(x,y): | def setup(x,y): | ||
Z = np.random.randint(2, size = (x,y)) | Z = np.random.randint(2, size = (x,y)) | ||
return Z | return Z | ||
- | | + | |
+ | |||
def deamon(x,y): | def deamon(x,y): | ||
return (np.random.randint(x),np.random.randint(y)) | return (np.random.randint(x),np.random.randint(y)) | ||
+ | |||
+ | def updateB(Z): | ||
+ | i,j = deamon(x,y) | ||
+ | k = (Z[(i-1)%x,(j-1)%y]+Z[(i-1)%x,j]+Z[(i-1)%x,(j+1)%y]\ | ||
+ | +Z[i,(j-1)%y]+Z[i,(j+1)%y]+Z[(i+1)%x,(j-1)%y]+\ | ||
+ | Z[(i+1)%x,j]+Z[(i+1)%x,(j+1)%y])+Z[(i+2)%x,j]+\ | ||
+ | +Z[(i-2)%x,j]+Z[i,(j+2)%y]+Z[i,(j-2)%y] | ||
+ | if Z[i,j] == 1: | ||
+ | if (k < 3 or k > 6): | ||
+ | Z[i,j] = 0 | ||
+ | else: | ||
+ | if k == 6: | ||
+ | Z[i,j] = 1 | ||
+ | return Z | ||
- | def update(Z): | + | def updateA(Z): |
i,j = deamon(x,y) | i,j = deamon(x,y) | ||
- | k = (Z[i-1,j-1]+Z[i-1,j]+Z[i-1,(j+1)%y]\ | + | k = (Z[(i-1)%x,(j-1)%y]+Z[(i-1)%x,j]+Z[(i-1)%x,(j+1)%y]+Z[i,(j-1)%y]+Z[i,(j+1)%y]+Z[(i+1)%x,(j-1)%y]+Z[(i+1)%x,j]+Z[(i+1)%x,(j+1)%y]) |
- | +Z[i,j-1]+Z[i,(j+1)%y]+Z[(i+1)%x,j-1]+\ | + | |
- | Z[(i+1)%x,j]+Z[(i+1)%x,(j+1)%y]) | + | |
if Z[i,j] == 1: | if Z[i,j] == 1: | ||
if (k > 3) or (k < 2): | if (k > 3) or (k < 2): | ||
Zeile 107: | Zeile 136: | ||
return Z | return Z | ||
- | def killall(Z): | ||
- | i,j = deamon(x,y) | ||
- | Z[i,j]= 0 | ||
- | return Z | ||
- | | ||
A = setup(x,y) | A = setup(x,y) | ||
plt.ion() | plt.ion() | ||
- | im=plt.imshow(A,interpolation='nearest') | + | im=plt.imshow(A,interpolation='nearest', cmap = plt.cm.gray_r) |
plt.xticks([]),plt.yticks([]) | plt.xticks([]),plt.yticks([]) | ||
- | for s in xrange(100): | + | for s in range(10000000): |
- | A = killall(A) | + | A = updateB(A) |
- | im.set_data(A) | + | if s%100 == 0: |
- | plt.draw() | + | im.set_data(A) |
+ | plt.draw() | ||
plt.ioff() | plt.ioff() | ||
plt.show() | plt.show() | ||
+ | |||
+ | #für josh!: | ||
+ | #codezeilen die du wolltest | ||
+ | #viel spaß | ||
+ | import numpy as np | ||
+ | import matplotlib.pyplot as plt | ||
+ | |||
+ | x = 100 | ||
+ | y = 100 | ||
+ | |||
+ | def setup(x,y): | ||
+ | #'''Erstellung der Welt mit Zuflliger An/Aus Verteilung ''' | ||
+ | Z = np.random.randint(2, size = (x,y)) | ||
+ | return Z | ||
+ | |||
+ | |||
+ | def deamon(x,y): | ||
+ | #'''Whlt zufllige Zelle fr asynchrones Update aus ''' | ||
+ | return (np.random.randint(x),np.random.randint(y)) | ||
+ | |||
+ | def intrinsic(Z, rule, mode): | ||
+ | i,j = deamon(x,y) | ||
+ | if mode == '2-radial': | ||
+ | k = (Z[(i-1)%x,(j-1)%y]+Z[(i-1)%x,j]+Z[(i-1)%x,(j+1)%y]\ | ||
+ | +Z[i,(j-1)%y]+Z[i,(j+1)%y]+Z[(i+1)%x,(j-1)%y]+\ | ||
+ | Z[(i+1)%x,j]+Z[(i+1)%x,(j+1)%y])+Z[(i+2)%x,j]+\ | ||
+ | +Z[(i-2)%x,j]+Z[i,(j+2)%y]+Z[i,(j-2)%y] | ||
+ | if mode == 'Moore': | ||
+ | k =(Z[(i-1)%x,(j-1)%y]+Z[(i-1)%x,j]+Z[(i-1)%x,(j+1)%y]\ | ||
+ | +Z[i,(j-1)%y]+Z[i,(j+1)%y]+Z[(i+1)%x,(j-1)%y]+\ | ||
+ | Z[(i+1)%x,j]+Z[(i+1)%x,(j+1)%y]) | ||
+ | if rule=='Diagonal': | ||
+ | if Z[i,j] == 1: | ||
+ | if (k < 3 or k > 6): | ||
+ | Z[i,j] = 0 | ||
+ | else: | ||
+ | if k == 6: | ||
+ | Z[i,j] = 1 | ||
+ | if rule=='Life': | ||
+ | if Z[i,j] == 1: | ||
+ | if (k > 3) or (k < 2): | ||
+ | Z[i,j] = 0 | ||
+ | else: | ||
+ | if k == 3: | ||
+ | Z[i,j] = 1 | ||
+ | if rule == 'Striche': | ||
+ | if Z[i,j] ==1: | ||
+ | if k > 2: | ||
+ | Z[i,j] = 0 | ||
+ | else: | ||
+ | if k == 2: | ||
+ | Z[i,j] = 1 | ||
+ | return Z | ||
+ | |||
+ | |||
+ | def environment(Z): | ||
+ | i,j = deamon(x,y) | ||
+ | Z[i,j] = 1 | ||
+ | return Z | ||
+ | |||
+ | |||
+ | A = setup(x,y) | ||
+ | stoer = (True, 21) | ||
+ | plt.ion() | ||
+ | |||
+ | im=plt.imshow(A,interpolation='nearest', cmap = plt.cm.gray_r) | ||
+ | plt.xticks([]),plt.yticks([]) | ||
+ | |||
+ | for s in range(10000000): | ||
+ | A = intrinsic(A, 'Diagonal', '2-radial') | ||
+ | if stoer[0] == True: | ||
+ | if s%stoer[1] == 0: | ||
+ | A = environment(A) | ||
+ | if s%100 == 0: | ||
+ | im.set_data(A) | ||
+ | plt.draw() | ||
+ | |||
+ | plt.ioff() | ||
+ | plt.show() | ||
+ | |||
+ | |||
+ | </code> |