Sich entwickelnde zellulÀre Automaten



Verbinden Sie die zellulÀren Automaten mit dem genetischen Algorithmus und sehen Sie, was passiert.

Der Artikel enthÀlt Gif (Verkehr!) Und kontrastierende Bilder. Epileptiker können einen epileptischen Anfall haben.

Regeln fĂŒr zellulare Automaten


Der einfachste zellulare Automat ist ein eindimensionaler zellularer Automat (es gibt auch nulldimensionale Automaten - wir werden weiter unten darauf eingehen). In einem eindimensionalen zellularen Automaten haben wir ein eindimensionales Array, dessen Zellen (Zellen) einen von zwei ZustĂ€nden annehmen können (1/0, wahr / falsch, weiß / schwarz, lebend / tot). Der nĂ€chste Zustand der Zelle in dem Array wird gemĂ€ĂŸ einer Regel durch den aktuellen Zustand der Zelle und den Zustand zweier benachbarter Zellen bestimmt.

Insgesamt existiert 23=8Kombinationen von ZellzustÀnden und zwei benachbarten Zellen:



Als nĂ€chstes schreiben wir fĂŒr jede der Kombinationen den Zustand der Zelle fĂŒr die nĂ€chste Iteration (fĂŒr den nĂ€chsten Zustand des Automaten) auf:



Ich habe eine Regel fĂŒr einen Mobilfunkautomaten. Die Regeln fĂŒr eindimensionale zellulare Automaten sind mit 8 Bit („Wolframcode“) codiert. Insgesamt existiert 28=256elementare zellulĂ€re Automaten:



256 Maschinen können manuell aussortiert werden. Wir werden nicht auf sie eingehen. Wir berechnen die Anzahl der vorhandenen Regeln fĂŒr zweidimensionale zellulare Automaten.

Ein zweidimensionaler zellularer Automat verwendet ein zweidimensionales Array. Jede Zelle hat 8 Nachbarn in der NĂ€he von Moore (es gibt auch ein von Neumann-Viertel, in dem diagonale Zellen nicht berĂŒcksichtigt werden. Wir werden dies im Artikel nicht berĂŒcksichtigen):



Der Einfachheit halber schreiben wir die Zellen in eine Zeile (wir werden die ausgewÀhlte Reihenfolge spÀter im Artikel verwenden):



FĂŒr einen zweidimensionalen zellularen Automaten existiert 29=512Kombinationen von ZellzustĂ€nden und 8 benachbarten Zellen:



Die Regel fĂŒr einen zweidimensionalen zellularen Automaten ist mit 512 Bit codiert. Insgesamt existiert 2512zweidimensionale zellulĂ€re Automaten:



Nummer:

2512 ca.1.340781 times10154



mehr Atome im beobachtbaren Universum ( 1080)
Manuell kann diese Anzahl von Maschinen nicht aussortiert werden. Wenn wir jede Sekunde einen Automaten betrachten wĂŒrden - wĂ€hrend der Existenz des Universums hĂ€tten wir es geschafft, alles zu betrachten  ca.4.35 times1017automatische Maschinen.

Einfache AufzÀhlung funktioniert nicht, aber mit Hilfe eines genetischen Algorithmus können wir Automaten finden, die bestimmten vordefinierten Kriterien am besten entsprechen.

Wir werden in JavaScript programmieren. Alle Codefragmente sind unter Spoilern versteckt, um Leser, die mit Programmiersprachen nicht vertraut sind, nicht zu verwirren.

Zweidimensionaler zellularer Automat


Wir schreiben einen zweidimensionalen zellularen Automaten mit einer Zufallsregel. Wir werden die Regel im Regelarray speichern, dessen LĂ€nge RegelgrĂ¶ĂŸe = 512 ist:

FĂŒllen Sie das Regelarray
var rulesize=512; var rule=[]; for(var i=0;i<rulesize;i++) rule[i]=Math.round(Math.random()); 

Als nĂ€chstes fĂŒllen Sie den Ausgangszustand der Maschine mit einem zufĂ€lligen Haus:

Wir fĂŒllen den Ausgangszustand der Maschine aus
 var sizex=89; var sizey=89; var size=2; var a=[]; for(var x=0;x<sizex;x++){ a[x]=[] for(var y=0;y<sizey;y++){ a[x][y]=Math.round(Math.random()); if(a[x][y]) context.fillRect(x*size, y*size, 1*size, 1*size); } } 

(hier und weiter im Artikel wird als Breite und Höhe der Maschine eine Zufallszahl genommen - nicht sehr groß und nicht sehr klein ungerade Zahl 89)

Die Funktion, die den folgenden Zustand des Automaten berechnet, sieht folgendermaßen aus (um ihn nicht zu verunreinigen, wurde die Initialisierung der ZeichenflĂ€che entfernt):

Wir betrachten den folgenden Zustand des Automaten
 function countpoints(){ var temp=[]; var xm, xp, ym, yp, q; for(var x=0;x<sizex;x++){ xm=x-1; if(xm==-1) xm=sizex-1; xp=x+1; if(xp==sizex) xp=0; temp[x]=[]; for(var y=0;y<sizey;y++){ ym=y-1; if(ym==-1) ym=sizey-1; yp=y+1; if(yp==sizey) yp=0; q=''+a[xm][ym]+a[x][ym]+a[xp][ym]+a[xm][y]+a[x][y]+a[xp][y]+a[xm][yp]+a[x][yp]+a[xp][yp]; q=parseInt(q, 2); temp[x][y]=rule[q]; if(temp[x][y]) context.fillRect(x*size, y*size, 1*size, 1*size); } } a=temp; } 

Die Variablen xm und xp speichern die X-Koordinaten des Nachbarn links und des Nachbarn rechts (x minus und x plus). Die Variablen ym und yp speichern die entsprechenden Y-Koordinaten.

Hier:

Das Feld der Maschine wird zu einem Bagel gerollt
  xm=x-1; if(xm==-1) xm=sizex-1; xp=x+1; if(xp==sizex) xp=0; 

Wir legen die periodischen Randbedingungen fest (das Feld des Automaten ist die OberflÀche des Torus).

Weiter:

... weiter
  q=''+a[xm][ym]+a[x][ym]+a[xp][ym]+a[xm][y]+a[x][y]+a[xp][y]+a[xm][yp]+a[x][yp]+a[xp][yp]; q=parseInt(q, 2); temp[x][y]=rule[q]; 

Schreiben Sie in der obigen Reihenfolge den Inhalt der Zellen in eine Zeichenfolge. Wir ĂŒbersetzen die Zeichenfolge in eine Dezimalzahl. FĂŒr diese Kombination finden wir im Regelarray den Zustand, den die Zelle mit den x- und y-Koordinaten annehmen soll.

Optimierte Option
 q=a[xm][ym]; q=(q<<1)+a[x][ym]; q=(q<<1)+a[xp][ym]; q=(q<<1)+a[xm][y]; q=(q<<1)+a[x][y]; q=(q<<1)+a[xp][y]; q=(q<<1)+a[xm][yp]; q=(q<<1)+a[x][yp]; q=(q<<1)+a[xp][yp]; temp[x][y]=rule[q]; 

Ersetzen Sie nach allen Iterationen den vorherigen Status des Automaten durch einen neuen:

Ersetzen Sie den vorherigen Status durch einen neuen
 a=temp; 

Wir zeichnen einen Automaten mit der Funktion setInterval:

setInterval
 timerId = setInterval(function() { countpoints(); }, 1); 

Im Browser ausfĂŒhren

Ich empfehle, die Maschine 10 bis 20 Mal mit zufÀlligen Regeln zu starten, bevor Sie den Artikel weiterlesen.

Wir können die Maschine sehr lange mit verschiedenen Zufallsregeln betreiben. Das Bild, das wir erhalten, unterscheidet sich nicht vom Bild auf dem Fernsehbildschirm, wenn kein Signal vorliegt:



Als nĂ€chstes wollen wir unseren „Fernseher“ mithilfe des genetischen Algorithmus einrichten.

Genetischer Algorithmus


Die GrĂ¶ĂŸe der ursprĂŒnglichen Population betrĂ€gt 200 Maschinen (Einzelpersonen). FĂŒr Regeln verwenden wir anstelle eines eindimensionalen Regelarrays ein zweidimensionales Populationsarray. Der erste Index (n) ist die Nummer des Individuums in der Bevölkerung.

Erstellen Sie eine Population
 var PopulationSize=200; var rulesize=512; var population=[]; var fitness=[]; for(var n=0;n<PopulationSize;n++){ population[n]=[]; fitness[n]=0; for(var i=0;i<rulesize;i++){ population[n][i]=Math.round(Math.random()); } } 

Das Fitness-Array enthĂ€lt die Fitness-Koeffizienten jedes Einzelnen. Dieses Array wird im Auswahlprozess ausgefĂŒllt. Nach der Auswahl beginnen wir den Evolutionsprozess.

Evolutionsprozess


Aus unserer Bevölkerung nehmen wir die HĂ€lfte der am besten angepassten Personen (entsprechend dem Fitnesskoeffizienten). Die verbleibende HĂ€lfte wird zerstört. Als nĂ€chstes nehmen wir zwei ĂŒberlebende Individuen und kreuzen sie.



WĂ€hlen Sie zum Überqueren eine zufĂ€llige Position in den Genotypen zweier Vorfahren aus. Vor dieser Position nehmen wir Gene von einem Vorfahren, nach dieser Position - von einem anderen. Wir setzen die ausgewĂ€hlten Gene im Genotyp einem Nachkommen zu. Die restlichen Gene sind fĂŒr einen anderen. Wir platzieren zwei Vorfahren und zwei Nachkommen in einer neuen Population. Gleichzeitig nimmt jeder Einzelne einmal an der Überfahrt teil.

Mutationen. Mit einer Wahrscheinlichkeit von 5% mutiert (zufĂ€llig invertiert) ein zufĂ€llig ausgewĂ€hltes Gen in jedem Individuum. Wenn Sie die Wahrscheinlichkeit von Mutationen erhöhen, gibt es erfolgreichere Mutanten. Gleichzeitig hat eine erfolgreiche Mutante möglicherweise keine Zeit, erfolgreiche Nachkommen zu hinterlassen, bevor sie erneut erfolglos mutiert. Wir werden spĂ€ter auf dieses Problem zurĂŒckkommen.

Funktion evolute ();
 function evolute(){ var sizehalf=PopulationSize/2; var sizequarter=sizehalf/2; var arrayt=[]; for(var n=0; n<PopulationSize; n++) arrayt[n]=[population[n], fitness[n]]; arrayt.sort(sortf); arrayt.length=sizehalf; population=[]; fitness=[]; for(var i=0; i<sizequarter; i++){ var i0=i*4; var i1=i*4+1; var i2=i*4+2; var i3=i*4+3; var removed1=Math.floor(Math.random()*(arrayt.length)); var parent1f = arrayt.splice(removed1,1); var parent1=parent1f[0][0]; var removed2=Math.floor(Math.random()*(arrayt.length)); var parent2f = arrayt.splice(removed2,1); var parent2=parent2f[0][0]; var child1=[]; var child2=[]; var qen=Math.floor(Math.random()*rulesize); var temp0=parent1; var temp1=parent2; var temp2=temp0.splice(qen,rulesize); var temp3=temp1.splice(qen,rulesize); var parent1=temp0.concat(temp2); var parent2=temp1.concat(temp3); var child1=temp1.concat(temp2); var child2=temp0.concat(temp3); population[i0]=parent1; population[i1]=parent2; population[i2]=child1; population[i3]=child2; fitness[i0]=0; fitness[i1]=0; fitness[i2]=0; fitness[i3]=0; } var mutation=document.getElementById("mutatepercent").value*1; var m=100/mutation; var m2=0;//0 for(var i=0; i<PopulationSize; i++){ var rnd=Math.floor(Math.random()*(m))+1; if(rnd==1){ var rnd2=Math.floor(Math.random()*(m2))+1; for(var j=0;j<rnd2;j++){ var gen=Math.floor(Math.random()*(rulesize)); if(population[i][gen]) population[i][gen]=0; else population[i][gen]=1; } } } } 

NatĂŒrliche Auslese


Vor Beginn des Evolutionsprozesses muss eine Auswahl getroffen werden. Die Auswahl kann sowohl natĂŒrlich als auch kĂŒnstlich sein. Die kĂŒnstliche Auswahl erfolgt manuell - etwas spĂ€ter. FĂŒr die natĂŒrliche Selektion legen wir einige Kriterien fest und wĂ€hlen die Maschinen aus, die den angegebenen Kriterien am besten entsprechen.

Welche Kriterien können im Voraus festgelegt werden? Nimm den einfachsten. Unser „Fernseher“ blinkt zu stark. Wir speichern zwei ZustĂ€nde des zellularen Automaten - bei 99 und bei 100 Iterationen. ZĂ€hlen Sie die Anzahl der Zellen, die sich nicht geĂ€ndert haben. Die resultierende Zahl wird als Fitnesskoeffizient verwendet. Ein Kriterium reicht uns natĂŒrlich nicht aus. Es ist einfach, manuell den Automaten auszuwĂ€hlen, der das gegebene Kriterium am besten erfĂŒllt: den Automaten [0,0,0, ..., 0] und den Automaten [1,1,1, ..., 1]. Bei der ersten Iteration werden diese beiden Automaten mit Nullen oder Einsen gefĂŒllt und Ă€ndern ihren Status nicht mehr. Wir definieren das zweite Kriterium: Die Differenz zwischen der Anzahl von 0 und 1 (Zellen) in der Maschine ĂŒberschreitet 100 nicht (die Anzahl wird "vom Bulldozer" genommen).

array1 - Zustand des Automaten bei der 99. Iteration. array2 - bei der 100. Iteration:

Wir ĂŒberlegen
 function countfitness(array1, array2){ var sum=0; var a0=0; var a1=0; for(var x=0;x<sizex;x++){ for(var y=0;y<sizey;y++){ if(array1[x][y]==array2[x][y]) sum++; if(array1[x][y]==0){ a0++; }else{ a1++; } } } if(Math.abs(a0-a1)<100) return sum; return 0; } 

Wir fangen an. Die optimale Lösung wurde im 421. Evolutionszyklus gefunden. In der Grafik sehen Sie den Fortschritt:



Der Graph ist entlang der Y-Achse skaliert. Der untere Punkt ist 0, der höchste Punkt ist 7921. Offensichtlich ist 7921 die optimale Lösung (alle Zellen in der 89x89-Maschine erfĂŒllen das angegebene Kriterium). Nach 100 Iterationen Ă€ndert keine Zelle ihren Status.

Die blauen Punkte in der Grafik sind die besten Personen in der Bevölkerung. Rotweine sind die schlechtesten (nur Personen, die das zweite Kriterium erfĂŒllen, werden berĂŒcksichtigt). Schwarze Punkte - der durchschnittliche Fitnesskoeffizient fĂŒr die gesamte Bevölkerung (unter BerĂŒcksichtigung von Personen, die das zweite Kriterium nicht erfĂŒllen). Das zweite Kriterium (das Gleichgewicht zwischen Weiß und Schwarz) ist sehr schwierig. Einige Automaten erfĂŒllen das zweite Kriterium auch nach 421 Evolutionszyklen nicht. Daher liegen schwarze Punkte unter rot.

Der Genpool der Population (Individuen entlang der Y-Achse, Gene entlang der X-Achse):



Mal sehen, welchen Kanal unser "Fernseher" gefangen hat:



Die gefundene Lösung ist nicht die einzig optimale. Wenn wir die Evolution (mit zufÀlligen anfÀnglichen Genotypen) wiederholen, werden wir andere optimale Lösungen finden. Einer von ihnen:



Ändern Sie die Auswahlkriterien.

Wir werden die Anzahl der Zellen betrachten, fĂŒr die ein Muster in der NĂ€he von Moore der Ordnung 2 erscheint. Nehmen wir das einfachste Muster:



Dieses Kriterium ist insofern interessant, als wir 25 Zellen ĂŒberprĂŒfen, wĂ€hrend der Automat den Zustand der Zelle basierend auf den ZustĂ€nden von 9 Zellen berechnet.

Das Kriterium ist sehr streng. Wenn wir einen zufĂ€lligen Automaten nehmen, sieht es nach 100 Iterationen folgendermaßen aus:



Keine einzige Zelle in einem solchen Automaten erfĂŒllt das gegebene Kriterium. Deshalb mildern wir das Kriterium ein wenig:

  1. Machen wir einen Fehler im Muster.
  2. Wir werden nicht bei der letzten Iteration nach dem Muster suchen, sondern bei den letzten 50 Iterationen.

Das zweite Kriterium (das Gleichgewicht zwischen Weiß und Schwarz) wird entfernt.

Wir fangen an. Grafik:



Die y-Achse ist beliebig. (In der vorherigen Maschine ist die optimale Lösung 7921. In dieser Maschine ungefÀhr 30.)
X-Achse - 3569 Evolutionszyklen. Zwei weiße vertikale Linien markieren 500 und 1000 Evolutionszyklen.
Blaue Punkte - das beste Individuum in der Bevölkerung, rot - das schlechteste, schwarz - das durchschnittliche VerhĂ€ltnis fĂŒr die gesamte Bevölkerung.

Die Lösung wurde in den ersten 500 Evolutionszyklen gefunden. In den nÀchsten 500 Zyklen verbessert sich die Lösung. Und dann entwickelt sich das System praktisch nicht mehr weiter.

In den drei folgenden Bildern: 500 Zyklen, 1000 Zyklen und 3569 Evolutionszyklen:



Genpool (3569):



In der Dynamik:



In der Abbildung unten sehen Sie, wie der Oszillator (Segelflugzeug) in dieser Maschine gebildet wird:



Wir können die Maschine mit dem Anfangszustand starten, in dem eine Zelle gefĂŒllt ist. Korrigieren Sie als NĂ€chstes alle Kombinationen von Zellen, die in den folgenden Iterationen des Automaten gefunden wurden. Ein Array von Genen (der Genotyp eines Automaten) ist ein Array aller möglichen Kombinationen. Nachdem wir nur die auftretenden Kombinationen isoliert haben, können wir leicht alle Gene feststellen, die an der Bildung des Oszillators beteiligt sind. Graue Balken sind Gene, die nicht an der Bildung des Oszillators beteiligt sind:



Mutationen in diesen Genen wurzeln nicht, weil sie die Musterbildung stören.

In unserer Maschine wird ein Muster (Quadrat) nur um eine schwarze Zelle gebildet. Versuchen wir, den Evolutionsprozess zusammen mit dem zweiten Kriterium zu starten: Der Unterschied zwischen der Anzahl der weißen und schwarzen Zellen ĂŒberschreitet 400 nicht.

Wir beginnen 3569 Evolutionszyklen. Grafik:



Schwarze Punkte in der Grafik sind der durchschnittliche Fitnesskoeffizient in einer Population. Weiße Punkte - der durchschnittliche Fitnesskoeffizient der vorherigen Maschine. Es wurde eine Lösung mit einem Fehler im Muster gefunden.

Genpool:



100 erste Iterationen:



Letzte (100) Iteration:



Ein bisschen nicht das Ergebnis, das wir erwartet hatten. Es gibt schwarze Quadrate, weiß - nein. VerschĂ€rfen Sie das zweite Kriterium: Die Differenz zwischen der Anzahl der weißen und schwarzen Zellen ĂŒberschreitet 100 nicht.

Wir beginnen 14865 Evolutionszyklen.
Die Grafik vergleicht die durchschnittlichen Fitnesskoeffizienten der Populationen. Blaue Punkte sind unser Maschinengewehr. Weiß und Schwarz sind frĂŒhere Maschinen.



Ein Automat entwickelt sich so heftig, dass es den Anschein hat, als wĂŒrde er sich ĂŒberhaupt nicht entwickeln. Das zweite Diagramm ist entlang der Y-Achse skaliert. Zwei weiße Linien - 500 und 1000 Zyklen.



Bei der besten Person entsprechen durchschnittlich 6 Zellen einem bestimmten Kriterium.

Schauen wir uns eine zufÀllige Maschine aus einer Population an.
50 Iterationen:



Letzte (50) Iteration:



Kein akzeptables Ergebnis gefunden. Das zweite Kriterium erschwert die Suche, daher werden wir es ablehnen (wir werden es spÀter in diesem Artikel nicht verwenden). Lassen wir dieses Muster und suchen nach ein paar anderen Mustern.

Muster:



Wir fangen an. 3000 Evolutionszyklen. Grafik:



Genpool:



In der Dynamik (100 Iterationen):



Letzte (100) Iteration:



Muster:



In frĂŒheren Maschinen durften wir einen Fehler im Muster machen. Lassen Sie uns diesmal nach dem genauen Muster suchen.

Wir beginnen 4549 Evolutionszyklen. Grafik:



Weiße vertikale Linie - 2500 Evolutionszyklen. Zu diesem Zeitpunkt (etwas frĂŒher) begann die Fitness der Bevölkerung schnell zu wachsen. Die Bevölkerung wurde gerettet, um eine Zwischenlösung zu finden. Die Zwischenlösung erwies sich als viel interessanter als die Lösung im 4549. Evolutionszyklus.

Lösung im 4549. Evolutionszyklus gefunden:



Es gibt 100 Iterationen auf Gif. Nach einer bestimmten Anzahl von Iterationen (ca. 500-2000) ist der Zustand des Automaten fast vollstÀndig geordnet (Höhe und Breite des Automaten werden speziell durch ungerade Zahlen ausgewÀhlt, so dass der Automat nicht vollstÀndig geordnet werden konnte):



Ein Automat mit geraden SeitengrĂ¶ĂŸen nimmt nach einer bestimmten Anzahl von Iterationen einen vollstĂ€ndig geordneten Zustand an. Automatisch 90x90, ungefĂ€hr 1200 Iterationen:



Zwischenlösung (gefunden im 2500. Evolutionszyklus):



Dieser Automat weiß auch, wie man einen bestimmten chaotischen Anfangszustand in einen bestimmten Zustand endlicher Ordnung verarbeitet (der endgĂŒltige geordnete Zustand ist eine Verschiebung des Musters entlang der X-Achse nach links + mehrere Oszillatorzellen).

Die 16x16-Maschine hat in ungefÀhr 100 Iterationen aussortiert:



32x32 - ungefÀhr 1000 Iterationen:



64x64 - ungefÀhr 6000 Iterationen:



90x90 - ungefÀhr 370000 Iterationen:



11x11 (ungerade Abmessungen des Automatenfeldes) - ungefÀhr 178700 Iterationen:



Das 13x13-Sturmgewehr wurde nicht in akzeptabler Zeit optimiert.

In der Abbildung unten zeigt die Maschine im Feld 256x256 bei der 100.000sten Iteration:



Ich empfehle, diesen Automaten in Dynamik ĂŒber ein großes Feld zu betrachten - es ist sehr interessant, den Prozess der Chaos-Selbstorganisation in diesem Automaten zu beobachten: in einem Browser ausfĂŒhren

Genpool der Zwischenpopulation:



Durch einen Neustart des Evolutionsprozesses können Sie andere Lösungen finden. Einer von ihnen:





Ein anderes Muster:



Lassen Sie uns bei der Suche nach einem Muster erneut einen Fehler machen (ohne Fehler entwickelt sich das System mit dem ausgewÀhlten Muster nicht weiter).

Wir fangen an. 5788 Evolutionszyklen. Grafik:



Die Skala ist beliebig.

Genpool:



In der Dynamik:



Der geordnete Zustand des Automaten (Musterverschiebung entlang der Y-Achse + mehrere Oszillatorzellen nach oben):



Es ist viel interessanter, nicht die Maschine selbst zu beobachten, sondern die Mutanten, die in dieser Population vorkommen:



Auf Gif ist die Maschine 256x256. 200 Iterationen. Die verbleibenden Iterationen können im Browser angezeigt werden .

Man könnte mit natĂŒrlicher Auslese enden und zu kĂŒnstlich ĂŒbergehen, aber ich möchte zeigen, wie viel 2512eine riesige Anzahl. Unter dieser Anzahl von Automaten finden wir einen Automaten, der ein bestimmtes Muster zeichnet (mit einer gewissen Genauigkeit fĂŒr komplexere Muster).

Das folgende Muster:



In frĂŒheren Experimenten haben wir die Summe der Zellen gezĂ€hlt, um die ein Muster gebildet wird (wenn mit einem Fehler, addieren Sie 1 zur Summe, wenn ohne Fehler, addieren Sie 2). Die resultierende Menge wurde als Fitnessfaktor fĂŒr den genetischen Algorithmus verwendet.

Bei einem komplexeren Muster funktioniert diese Methode nicht. Ein Automat, bei dem eine kleinere Anzahl von Zellen einem bestimmten Kriterium besser entspricht (die Anzahl von Zellen, die dem Muster in der NĂ€he der Zelle entsprechen), verliert jedes Mal gegen einen Automaten, bei dem eine grĂ¶ĂŸere Anzahl von Zellen einem bestimmten Kriterium weniger genau entspricht. Wie im Beispiel mit den obigen Quadraten:



FĂŒr das gewĂŒnschte Muster betrachten wir bei der 100. Iteration jedes Automaten in der Population, der von jeder Zelle umgeben ist, die Anzahl der Zellen, die mit dem Muster ĂŒbereinstimmen. Wir werden nur das beste Ergebnis fĂŒr jede Maschine erzielen. Die Anzahl der Zellen, die dem Muster entsprechen, wird als Fitnessfaktor verwendet. Das Muster besteht aus 7x17 = 119 Zellen. Diese Zahl wird als optimale Lösung angesehen. 6000 Evolutionszyklen ermöglichten es uns, einen Automaten zu finden, der ein Muster mit 5 Fehlern zeichnet (114 Zellen stimmen mit dem Muster ĂŒberein).

Grafik in beliebigem Maßstab:



Ein Anstieg des Prozentsatzes der Mutationen beeintrÀchtigte die Fitness der Bevölkerung nicht.

Es gibt viele Mutanten im Genpool der Bevölkerung:



Ein zufÀlliger Automat aus einer Population in der Dynamik:



Die beste Maschine bei der 100. Iteration:



Gesuchte und gefundene Muster:



Nachdem man mit den Auswahlkriterien, der GrĂ¶ĂŸe des Automatenfeldes und dem Prozentsatz der Mutationen gespielt hatte, stellte sich heraus, dass sich die Population verbesserte und ein Automat gefunden wurde, der nur 3 Fehler im Muster macht.

Genpool:



Maschine bei der 100. Iteration:



Gesuchte und gefundene Muster:



2 Fehler
WĂ€hrend des Schreibens des Artikels wurde das System weiterentwickelt. FĂŒr eine genauere Suche wurde die GrĂ¶ĂŸe des Maschinenfelds auf 513 x 513 erhöht. Es wurde ein Automat gefunden, der nur zwei Fehler im Muster macht:




In vier Diagrammen können Sie sehen, wie sich das System mit unterschiedlichen Mutationswahrscheinlichkeiten entwickelt (1 Gen mutiert):



Rote Punkte sind der durchschnittliche Fitnesskoeffizient in einer Population. Schwarze Punkte sind der Fitnesskoeffizient jedes Einzelnen. 3000 Evolutionszyklen fĂŒr jedes System.

Genpools von Populationen (in derselben Reihenfolge):









Automaten bei der 100. Iteration:









Lassen Sie uns ein weiteres Experiment durchfĂŒhren. Das Muster ist das gleiche. Die anfĂ€nglichen Genotypen sind mit zufĂ€lligen Genen gefĂŒllt. Die Wahrscheinlichkeit von Mutationen betrĂ€gt 5%. 1 bis 8 Gene mutieren (fĂŒr jedes Individuum wird eine zufĂ€llige Anzahl mutierender Gene genommen). 100 Evolutionszyklen.



Die Grafik ist eine WĂ€rmekarte. Die PunktgrĂ¶ĂŸe im Diagramm betrĂ€gt 5 Pixel. Der Ursprung ist die obere linke Ecke.
Auf der Y-Achse (von 0 bis 100) - Evolutionszyklen. Auf der X-Achse (von 0 bis 119) - die Anzahl der Zellen, die mit dem Muster ĂŒbereinstimmen (fĂŒr jedes Individuum in der Population erhalten wir das beste Ergebnis). Die Helligkeit des Punktes ist die Anzahl der Personen mit dem angegebenen Ergebnis (X-Koordinate).

FĂŒhren Sie den genetischen Algorithmus viermal mit denselben Parametern aus (100 Zyklen, 5% Mutationen, bis zu 8 Gene mutieren). In der Grafik beginnen alle 5:



Die folgenden 5 Starts: 25% Mutationen, bis zu 8 Gene mutieren:



Die Stichprobe ist klein, aber wir können RĂŒckschlĂŒsse auf die Wirksamkeit der Erhöhung des Prozentsatzes der Mutationen ziehen.

Als nÀchstes werde ich die Ineffizienz der im Artikel verwendeten Kreuzungsmethode zeigen.

Zuvor verwendete Methode:



Anstatt den Genotyp in zwei Teile zu teilen, erben Nachkommen zufÀllige Ahnengene:



5% Mutationen:



25%:



Als nÀchstes werden wir diese Methode der Kreuze verwenden.

Darauf mit natĂŒrlichem Selektionsfinish. Wenn jemand interessante Ideen zu den Kriterien fĂŒr die natĂŒrliche Selektion hat, Ă€ußern Sie diese bitte in den Kommentaren.

FĂŒr die kĂŒnstliche Selektion werden zellulĂ€re Automaten zweiter Ordnung verwendet .

Mobilfunkautomat zweiter Ordnung



Betrachten Sie einen nulldimensionalen zellularen Automaten erster Ordnung (alle oben betrachteten zellularen Automaten sind erster Ordnung). Ein nulldimensionaler zellularer Automat besteht aus einer Zelle. Eine Zelle kann sich in einem von zwei ZustÀnden befinden. Der nÀchste Zustand der Zelle (t) wird durch den aktuellen Zustand der Zelle (t-1) bestimmt. Insgesamt gibt es 4 nulldimensionale zellulare Automaten (darunter einen Oszillator):



In einem zellularen Automaten zweiter Ordnung wird der nÀchste Zustand der Zelle (t) durch den aktuellen Zustand (t-1) und den vorherigen Zustand der Zelle (t-2) bestimmt. Insgesamt gibt es 4 Kombinationen von zwei ZellzustÀnden. 24=$1- die Anzahl der nulldimensionalen zellularen Automaten zweiter Ordnung:



Solche zellularen Automaten weisen komplexere Oszillatoren auf.

28=256zellulÀre Automaten dritter Ordnung:



216=65536Zellularautomaten vierter Ordnung können nicht in einem Bild gezeigt werden.

Suche nach Zellenautomaten n-te Ordnung mit einer Schwingungsperiode gleich n- Die Aufgabe ist nicht trivial und Ă€ußerst interessant. Dieses Thema verdient einen separaten Artikel.

In zweidimensionalen eindimensionalen zellulÀren Automaten wird der folgende Zustand einer Zelle durch den aktuellen Zustand von drei Zellen und den vorherigen Zustand einer Zelle bestimmt:



Es gibt 216=65536eindimensionale zellulÀre Automaten zweiter Ordnung.

Code:

 var rule=[]; for(var i=0;i<16;i++) rule[i]=Math.round(Math.random()); var a=[]; var b=[]; var temp; for(var x=0;x<sizex;x++){ a[x]=0; b[x]=0; } b[63]=1; var xm, xp, q; for(var y=2;y<sizey;y++){ temp=[]; for(var x=0;x<sizex;x++){ xm=x-1; if(xm<0) xm=sizex+xm; xp=x+1; if(xp>=sizex) xp=xp-sizex; q=b[xm]; q=(q<<1)+b[x]; q=(q<<1)+b[xp]; q=(q<<1)+a[x]; temp[x]=rule[q]; if(temp[x]) context.fillRect(x*size, y*size, size, size); } a=b; b=temp; } 


Zellularautomaten zweiter Ordnung zeichnen komplexere Muster als Zellularautomaten erster Ordnung.

In den folgenden Bildern sind mehrere Zufallsmaschinen zweiter Ordnung (auf der linken Seite des Bildes - im Zustand t-1 ist eine Zelle rechts gefĂŒllt - fĂŒr die ZufallszustĂ€nde t-1 und t-2 ist der BinĂ€rcode der Inhalt des

Regelarrays ): 0011111011001000:


0101101110011110: 0110000110010010: 0110011010010110


:


1110011010010110:


0110111010000101:


1111101001110110:


1001010001100000:


Dieselbe


Maschine 256x256:



512x512



Andere Maschinen sind hier zu sehen:
Eindimensionale Mobilfunkmaschine zweiter Ordnung.
Eindimensionaler zellularer Automat dritter Ordnung.

Eindimensionale zellulÀre Automaten zweiter Ordnung finden sich in Wolframs Buch A New Kind of Science.

KĂŒnstliche Selektion



Wie ein eindimensionaler zellularer Automat zweiter Ordnung verwenden wir in einem zweidimensionalen zellularen Automaten zweiter Ordnung eine zusÀtzliche Zelle aus dem vorherigen (t-2) Zustand des Automaten.

Der Einfachheit



halber platzieren wir diese Zelle am Anfang der BinÀrzeile: Die Bequemlichkeit liegt in der Tatsache, dass der Automat, wenn die erste und die zweite HÀlfte des Genotyps zusammenfallen, als Automat erster Ordnung betrachtet werden kann:



Durch HinzufĂŒgen einer Zelle haben wir die Anzahl der vorhandenen Automaten in erhöht mal.2512
- die Anzahl der vorhandenen zweidimensionalen Automaten zweiter Ordnung. FĂŒr die natĂŒrliche Selektion haben wir ein Kriterium bestimmt und Automaten anhand dieses Kriteriums verglichen. Bei der kĂŒnstlichen Auswahl wĂ€hlen wir die Maschinen manuell nach einem undeutlichen Prinzip aus: "Diese Maschine ist interessant, aber das ist nicht sehr." Mit diesem Prinzip können Sie nicht die beste Maschine unter zufĂ€lligen Maschinen auswĂ€hlen:Es gibt verschiedene Möglichkeiten, dieses Problem zu lösen. Ich schlage vor, vier Möglichkeiten in Betracht zu ziehen.2512×2512=21024











1. Im Ausgangszustand der Maschine ist eine Zelle gefĂŒllt



Eine Möglichkeit besteht darin, die Entwicklung eines zellularen Automaten zu beobachten, in dessen Ausgangszustand eine Zelle gefĂŒllt ist.

Wir fĂŒllen die anfĂ€ngliche Population mit zufĂ€lligen Maschinen. Mehrere Maschinen aus der ursprĂŒnglichen Grundgesamtheit (jeweils 30 Iterationen):



Diese beiden blinken


Eine kleine Anzahl von Automaten mit weniger chaotischem Verhalten ist in der Bevölkerung vorhanden. Wir werden sie fĂŒr die Kreuzung auswĂ€hlen:





20 zufĂ€llige Maschinen aus der ursprĂŒnglichen Population (Zustand der Maschinen bei der 30. Iteration):



Nach drei Evolutionszyklen:



Nach acht Evolutionszyklen:



Acht Evolutionszyklen reichten aus, um die gesamte Population mit einer Maschine mit einem bestimmten Merkmal zu fĂŒllen (eine Maschine, die Dreiecke zeichnet). .

2. Der Genotyp ist teilweise gefĂŒllt



Wenn das VerhÀltnis von Einheiten und Nullen im Genotyp verletzt wird, wird das VerhÀltnis von Einheiten und Nullen im PhÀnotyp verletzt.

Im Genotyp (Regel) des Automaten werden die folgenden ZellzustĂ€nde fĂŒr alle möglichen Kombinationen der Zelle und benachbarter Zellen aufgezeichnet. Wenn der Genotyp mehr Nullen (oder Einsen) enthĂ€lt, sammeln sich Nullen (oder Einsen) in den folgenden ZustĂ€nden des Automaten an. Es ist interessant, die Korrelation zwischen dem VerhĂ€ltnis von Einsen und Nullen im Genotyp und dem VerhĂ€ltnis von Einsen und Nullen im PhĂ€notyp zu untersuchen.

Erstellen Sie ein Diagramm.

Erstellen Sie eine Population von 200 Maschinen. Wir fĂŒllen die Genotypen mit Nullen (1024 Gene im Genotyp eines zweidimensionalen Automaten zweiter Ordnung). Weiter Gene sind mit Einheiten gefĂŒllt. FĂŒr die erste Bevölkerungn fĂŒr die 513. Bevölkerungn=0n=512 . Entlang der Achse ist die Bevölkerungszahl. Entlang der Achsex markiert (mit weißen Punkten) das VerhĂ€ltnis von Einsen und Nullen im Genpool der Population. Wir haben eine Hyperbel:FĂŒr jeden Automaten (mit einer FeldgrĂ¶ĂŸe von 89x89) betrachten wir 100 Iterationen. Bei der 100. Iteration zĂ€hlen wir die Anzahl der Einsen und Nullen im Zustand (PhĂ€notyp) jedes Automaten. Wir markieren in der Grafik das VerhĂ€ltnis von Einheiten und Nullen (die Gesamtzahl aller Einheiten wird durch die Gesamtzahl aller Nullen geteilt). Wir haben eine Kurve:Anstelle des GesamtverhĂ€ltnisses von Einsen und Nullen in allen PhĂ€notypen können Sie das VerhĂ€ltnis von Einsen und Nullen in jedem PhĂ€notyp betrachten:Auf der linken Seite des Diagramms befinden sich Punkte mit der grĂ¶ĂŸten Abweichung vom Durchschnittswert. Es kann angenommen werden, dass dies Automaten sind, in deren Genotypen das Null-Gen gleich Eins ist. Angenommen - geprĂŒft. Wir setzen das Null-Gen immer gleich Null. Wir zeichnen ein neues Diagramm:y















Vergleichen Sie mit Maschinen, bei denen das Null-Gen immer gleich Eins ist:



Bei Maschinen zweiter Ordnung gibt es ein weiteres Null-Gen - das 512. Gen. Mal sehen, wie dieses Gen den PhÀnotyp beeinflusst.

Das 0. und 512. Gen sind immer Null: Das



0. Gen ist immer Null. Das 512. Gen ist immer gleich eins:



Um unsere geschĂ€tzten Epileptiker nicht noch einmal zu verspotten, werden das 0. und 512. Gen in der Anfangspopulation des genetischen Algorithmus mit Nullen gefĂŒllt.

Schauen wir uns die Maschinen an, die wir durch Setzen von Nullen auf das 0. und 512. Gen beseitigt haben.

Die ersten 8 ZustĂ€nde eines Automaten, in denen nur das 0. Gen gefĂŒllt ist (das Null-Gen ist Eins, der Rest sind Nullen): Ein



Automat, in dem nur das 512. Gen



gefĂŒllt ist : Ein Automat, in dem nur das 0. und 512. Gen gefĂŒllt sind:



Lassen Sie uns eine Stelle in der Grafik herausgreifen, an der sich die Population in Gruppen aufteilt:



An dieser Stelle sind die Genotypen zu 25% gefĂŒllt.

Vergleichen Sie zwei Populationen.

Erste Bevölkerung. 30 zufÀllige Maschinen bei der 1000. Iteration. Genotypen sind zu 50% voll (512 Einheiten und 512 Nullen):



Die zweite Population. 30 zufÀllige Maschinen bei der 1000. Iteration. Die Genotypen sind zu 25% voll (256 Einheiten und 768 Nullen):



Die zweite Population ist fĂŒr die kĂŒnstliche Selektion geeignet. Wir können einige der Zeichen in solchen Maschinen leicht hervorheben. Zum Beispiel: "dunkler", "weniger chaotisch" (Automaten, in denen weiße Zellen gruppiert sind) usw.

Wir wÀhlen "dunkler". Die Wahrscheinlichkeit von Mutationen betrÀgt 10%, bis zu 4 Gene mutieren. Nach der ersten Auswahl:



Nach der zweiten Auswahl:



Ein interessanter Automat erschien in der Bevölkerung.

256x256, Zustand der Maschine bei der 1000. Iteration: Die



Maschine fĂŒllt allmĂ€hlich die Population.

Nach der achten Auswahl:



Eine weitere interessante Maschine erschien.

256x256, Zustand des Automaten bei der 1000. Iteration:



Population nach dreizehn Auswahlen:



Mehrere Automaten aus dieser Population. 256x256, 1000. Iteration fĂŒr alle. Unter dem Bild befindet sich ein Link, auf den Sie klicken können, um die Maschine in der Dynamik anzuzeigen:


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.

3. Conway-Automatikmaschine und dergleichen



Der bekannteste zweidimensionale zellulare Automat erster Ordnung ist das Conway-Automatenspiel „Life“ .

Die Regeln fĂŒr den Conway-Automaten lauten wie folgt:
Wenn sich 3 lebende Zellen um eine tote Zelle befinden, wird die Zelle zum Leben erweckt (ansonsten bleibt sie tot).
Wenn sich 2 oder 3 lebende Zellen um eine lebende Zelle befinden, bleibt die Zelle am Leben (andernfalls stirbt sie ab).
Eine tote Zelle ist 0, eine lebende Zelle ist 1.

Um eine Zelle herum können 0 bis 8 lebende Zellen sein. Nach 9 Optionen rund um die lebende und um die tote Zelle. Wir schreiben alle Optionen in das r-Array:

Array r
 r=[ 0,0,0,1,0,0,0,0,0, 0,0,1,1,0,0,0,0,0 ]; 


Die erste HĂ€lfte des Arrays ist fĂŒr eine tote Zelle, die zweite fĂŒr eine lebende Zelle.

Wir können die Regel des Conway-Automaten fĂŒr alle möglichen (512) Kombinationen einer Zelle und 8 benachbarter Zellen beschreiben:

Malen Sie die Regel
 r=[ 0,0,0,1,0,0,0,0,0, 0,0,1,1,0,0,0,0,0 ]; var rule=[]; var q1, q2; for(var i=0;i<512;i++){ var ii=i.toString(2); for(var j=ii.length;j<9;j++) ii='0'+ii; q1=1*ii[4]; q2=1*ii[0]+1*ii[1]+1*ii[2]+1*ii[3]+1*ii[5]+1*ii[6]+1*ii[7]+1*ii[8]; if(q1==0) rule[i]=r[q2]; else rule[i]=r[q2+9]; } 


Optimierte Option
 r=[ 0,0,0,1,0,0,0,0,0, 0,0,1,1,0,0,0,0,0 ]; var rule=[]; for(var i=0;i<512;i++){ var q=((i>>4)&1)*8; for(var j=0;j<9;j++){ q+=(i>>j)&1; } rule[i]=r[q]; } 


Kopieren Sie fĂŒr einen Automaten zweiter Ordnung die zweite HĂ€lfte des Regelarrays aus der ersten:

Kopieren
 for(var i=0;i<512;i++){ if(rule[i]==0) rule[i+512]=0; else rule[i+512]=1; } 


Wir starten die Maschine mit der angegebenen Regel. Wir sehen die charakteristischen Segelflugzeuge und Oszillatoren. Mehrere Iterationen dieses Automaten:



Array r besteht aus 18 Zellen. Es gibt Automaten Ă€hnlich dem Conway-Automaten (die nach denselben Regeln geschrieben werden können: die Anzahl der von den Toten umgebenen lebenden Zellen, in denen die Zelle zum Leben erweckt wird, und die Anzahl der lebenden Zellen in der lebenden Umgebung, in der die Zelle stirbt).Sie können siehieransehen(standardmĂ€ĂŸig startet der Conway-Automat, die SchaltflĂ€che „Regel Ă€ndern“ fĂŒllt das r-Array zufĂ€llig aus).Mehrere zufĂ€llige Maschinen (BinĂ€rcode - Array r):110010011001111111100001100110111110011111000100101110010000110000110010001111010011100111000111001000000110000101100010100001000001111101011111000001100110111111218=262144































FĂŒr einen genetischen Algorithmus können Sie als Genotyp als Array r ( Kombinationen) und das Regelarray (218 Kombinationen der ersten Ordnung fĂŒr die zellulĂ€ren Automaten und2512 - fĂŒr einen zellularen Automaten zweiter Ordnung).21024

ist eine relativ kleine Zahl. Mit dieser Nummer können Sie die Regel fĂŒr die Maschine manuell auswĂ€hlen, ohne einen genetischen Algorithmus zu verwenden (was Conway tatsĂ€chlich getan hat). Wenn Sie das Regelarray mit zufĂ€lligen Maschinen dieses Typs fĂŒllen und dieses Array als Genotyp verwenden, kann das Experiment bis zu einem gewissen Grad als nicht erfolgreich angesehen werden (genug, um die Ergebnisse dieses Experiments im Artikel nicht anzuzeigen). In den Regeln derartiger zellularer Automaten gibt es Symmetrie. Zum Beispiel fĂŒr die folgenden Zellkombinationen:218




... und fĂŒr diese


Der Zustand der Zelle bei der nĂ€chsten Iteration ist der gleiche. Nach der ersten Kreuzung wird die Symmetrie in den Regeln der Nachkommen gebrochen. Vorfahren sammeln Mutationen an, die auch die Symmetrie zerstören. Eine Verletzung der Symmetrie im Genotyp fĂŒhrt zu einer Verletzung der Symmetrie im PhĂ€notyp.

Man kann die Manifestation dieser Symmetrie im PhĂ€notyp sehen, wenn eine Zelle im Anfangszustand des Automaten gefĂŒllt ist.

Lass uns ein Experiment machen. Um die Symmetrie aufrechtzuerhalten, verwenden wir das r-Array als Genotyp. 5% Mutationen, 1 Gen mutiert. Im Ausgangszustand ist eine Zelle gefĂŒllt.

30 zufÀllige Maschinen aus der Grundgesamtheit. Der Zustand der Automaten bei der 30. Iteration:



Versuchen wir, solche Automaten zu isolieren, die sich am langsamsten aus einer Zelle entwickeln (wachsen).







Nach der ersten Auswahl wurden Automaten entfernt, die sich nicht entwickeln:



In der neuen Population gibt es mehrere solcher Automaten (die sich nicht entwickeln) - dies sind erfolglose Nachkommen und Mutanten.

Als nĂ€chstes werden wir hauptsĂ€chlich Maschinen mit weißem Hintergrund auswĂ€hlen (Zellen, zu denen sich die Maschine nicht entwickelt hat).

Schwarze Automaten blinken.
( — ) — . ( ) ( ). . — () . ( — , — ). 30- , — . ( 30- ) — ( ).

Grundgesamtheit nach der zweiten Auswahl:



3 Auswahlen:



5 Auswahlen:



8 Auswahlen:



13 Auswahlen:



Dieselben Maschinen bei der 60. Iteration:



21 Auswahlen. Der Zustand der Automaten bei der 30. Iteration: Der



Zustand der Automaten bei der 60. Iteration:



34 Auswahlen. Zustand der Automaten bei der 30. Iteration:



Zustand der Automaten bei der 60. Iteration:



Außerdem entwickelt sich das System nicht weiter. Drei Automaten aus dieser Population (jeweils 100 Iterationen):

[1,0,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1]


[1 , 0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,1]


[1,0,0,1,1,0,0, 1,1,0,1,0,1,1,0,1,1,1]


Zum Vergleich eine Zufallsmaschine:

[1,0,0,1,1,1,0,1,1,1,0, 0,1,1,0,0,0,1]


4. Conway-Automat und dergleichen (2)



In Maschinen mit den Regeln des Conway-Typs zÀhlen wir die Anzahl der lebenden (Einheiten) Zellen in der NÀhe von Moore. Diese Nachbarschaft kann in 4 Paare unterteilt werden und die Anzahl der lebenden Zellen in diesen Paaren zÀhlen:



Somit erhöhen wir die Anzahl der Automaten, behalten aber die Symmetrie im PhÀnotyp bei.

Jedes Paar kann 0 bis 2 lebende Zellen haben. Par 4. Anzahl der Kombinationen34=81 .Nach der 81. Kombination um die lebende und um die tote Zelle. Insgesamt existiert Automaten dieses Typs. Nummer:2162



2162≈5.846×1048



Es ist vollstÀndig astronomisch und passt zu einem genetischen Algorithmus.

Die GenotypgrĂ¶ĂŸe jedes Individuums betrĂ€gt 162 Gene:

FĂŒllen Sie die Bevölkerung mit zufĂ€lligen Maschinen
 var rulesize=162; for(var n=0;n<PopulationSize;n++){ population[n]=[]; fitness[n]=0; for(var i=0;i<rulesize;i++){ population[n][i]=Math.round(Math.random()); } } 

Als nĂ€chstes malen wir diese Regel fĂŒr alle möglichen Kombinationen einer Zelle und acht benachbarter Zellen:

Funktion fillrule ();
 function fillrule(){ var r; for(var n=0;n<PopulationSize;n++){ rule[n]=[]; r=population[n]; var q1, q2, q3, q4, q5; var q; for(var i=0;i<512;i++){ var ii=i.toString(2); for(var j=ii.length;j<9;j++) ii='0'+ii; q1=1*ii[4]; q2=1*ii[0]+1*ii[8]; q3=1*ii[1]+1*ii[7]; q4=1*ii[2]+1*ii[6]; q5=1*ii[3]+1*ii[5]; q=parseInt(''+q2+q3+q4+q5,3); if(q1==0) rule[n][i]=r[q]; else rule[n][i]=r[q+81]; } } } 

Wir werden das Regelarray verwenden, wenn wir den nÀchsten Zustand des Automaten berechnen. Wir rufen die Funktion fillrule () nach dem Laden der Seite und nach dem Aufrufen der Funktion evolute () auf.

Die anfÀngliche Bevölkerung sieht chaotisch aus. 30 zufÀllige Maschinen, die 1000. Iteration:



Dieses Chaos variiert geringfĂŒgig in der Dynamik und die Maschinen eignen sich gut zur Auswahl, aber machen wir es einfacher - wir werden die „dunkelsten“ auswĂ€hlen.

Bevölkerung nach fĂŒnf Auswahlen:



Als nĂ€chstes können Sie nach Maschinen mit den komplexesten Oszillatoren suchen. Der gesamte Prozess des Auslegens ist sinnlos. Im Folgenden sind einige der interessantesten Automaten aufgefĂŒhrt, die mit dem genetischen Algorithmus gefunden wurden.

256x256, 10000. Iteration fĂŒr alle. Unter dem Bild befindet sich ein Link, auf den Sie klicken können, um die Maschine in der Dynamik anzuzeigen:


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.


Ansicht in Dynamik.

Ein StĂŒck?


Und hier können Sie herumspielen:

Zweidimensionale zellulare Automaten zweiter Ordnung.

Schnittstelle:



Die SchaltflÀche Start startet die Maschinen.
Stop - stoppt.
Eins ist eine Iteration.
Löschen - stoppt die Maschine und fĂŒllt den Ausgangszustand mit einem Zufall.
Löschen (1 Zelle) - stoppt die Maschine und fĂŒllt eine Zelle im Ausgangszustand.
Die verbleibenden SchaltflĂ€chen in dieser Zeile zĂ€hlen die angegebene Anzahl von Iterationen fĂŒr jeden Automaten.
Das Rendern eines Automaten auf Leinwand verbraucht die gesamte Leistung. Wenn Sie schnell 200 Iterationen berechnen mĂŒssen, klicken Sie auf "Anzahl 200". Wir klicken nicht auf die SchaltflĂ€che "Anzahl 5000" - der Browser kann sie aufhĂ€ngen.

Unter 20 zufĂ€lligen Maschinen (PopulationsgrĂ¶ĂŸe - 200 Maschinen). Unter den KontrollkĂ€stchen der Verkaufsautomaten. Wir markieren die interessantesten. DrĂŒcken Sie Auswahl - die Fitness des GerĂ€ts erhöht sich um die rechts angegebene Zahl.
Mutationen - die Wahrscheinlichkeit von Mutationen.
Gens ist die Anzahl der mutierenden Gene.

Evolution starten - Startet den Mechanismus von Kreuzen und Mutationen.

Genotyp fĂŒllen - fĂŒllt die angegebene Anzahl von Genen im Genotyp jedes Automaten.
Conway - fĂŒllt die Bevölkerung mit Maschinen vom Typ Konveevsky.

Nachfolgend zwei Zeilen: Die
Nummern der angezeigten Maschinen.
Der Inhalt des Fenotype-Arrays.

Der Genpool der Bevölkerung ist noch geringer.

Alle Fortschritte werden im lokalen Speicher gespeichert.

Sie können hier mit Sturmgewehren vom Typ Konveevsky (mit denen, die zuletzt im Artikel betrachtet wurden) spielen:

4. Conway-Automat und dergleichen (2).

Source: https://habr.com/ru/post/de455958/


All Articles