Ein einfaches Programm zur Simulation primitiven künstlichen Lebens unter Verwendung einfacher Regeln der Anziehung oder Abstoßung zwischen atomähnlichen Partikeln, wodurch komplexe selbstorganisierende lebensähnliche Muster erzeugt werden. Ohne die GUI-Elemente ist der Code kleiner als eine Seite. Das Video-Tutorial und die Komplettlösung finden Sie unten.
https://youtu.be/0Kx4Y9TVMGg
Klicken Sie hier für eine Live-Demo (JavaScript):
Sie müssen bei den Parametern nicht genau sein, um diese Muster zu reproduzieren. Der beste Weg, interessante Muster zu erhalten, besteht darin, zunächst zufällige Parametererkundungen auszuprobieren. Sobald Sie ein interessantes Muster gefunden haben, versuchen Sie, es schrittweise zu verfeinern. Um zu vermeiden, dass Sie bei einem lokalen Maximum hängen bleiben, können Sie gelegentlich große Parametersprünge machen. Auf diese Weise sollen immer wieder interessante und unterschiedliche Muster auftauchen.
Laden Sie dieses Repo herunter. Entpacken Sie die Datei, gehen Sie dann zum Ordner /particle_life/bin/ und klicken Sie auf „particle_life.exe“.
Der Quellcode ist in C++, JavaScript und Python verfügbar. Sehen Sie sich dieses YouTube-Video für eine exemplarische Anleitung an: https://youtu.be/0Kx4Y9TVMGg
Wenn Sie zum C++-Programm beitragen möchten, sind die ersten 100 Codezeilen der Kernalgorithmus unter: „/particle_life/src/ofApp.cpp“. Der Rest sind GUI-Komponenten und Rendering-Steuerelemente, die von der openFrameworks-Bibliothek bereitgestellt werden, einer Open-Source- und benutzerfreundlichen Bild-Rendering-Bibliothek.
Laden Sie zunächst dieses Repository herunter und laden Sie dann die openFrameworks-Bibliothek von hier herunter: https://openframeworks.cc/. Verwenden Sie den projectGenerator von openFramework und importieren Sie den Ordner /particle_life/ in das Projekt.
Alternativ können Sie ein neues openFramework-Projekt erstellen und ofxGui hinzufügen. Sobald die Projektdateien generiert sind, ersetzen Sie den Ordner /src/ durch den hier bereitgestellten.
Sie können jetzt den C++-Code auf Ihrem Computer kompilieren.
Schauen Sie sich auch die Datei „particle_life.html“ an, um eine optimierte Version zu finden – vielen Dank an diejenigen, die dazu beigetragen haben.
< canvas id =" life " width =" 500 " height =" 500 " > </ canvas >
< script >
//Hunar Ahmad @ brainxyz
m = document . getElementById ( "life" ) . getContext ( "2d" ) ;
draw = ( x , y , c , s ) => {
m . fillStyle = c ;
m . fillRect ( x , y , s , s ) ;
} ;
atoms = [ ] ;
atom = ( x , y , c ) => {
return { x : x , y : y , vx : 0 , vy : 0 , color : c } ;
} ;
random = ( ) => {
return Math . random ( ) * 400 + 50 ;
} ;
create = ( number , color ) => {
group = [ ] ;
for ( let i = 0 ; i < number ; i ++ ) {
group . push ( atom ( random ( ) , random ( ) , color ) ) ;
atoms . push ( group [ i ] ) ;
}
return group ;
} ;
rule = ( atoms1 , atoms2 , g ) => {
for ( let i = 0 ; i < atoms1 . length ; i ++ ) {
fx = 0 ;
fy = 0 ;
for ( let j = 0 ; j < atoms2 . length ; j ++ ) {
a = atoms1 [ i ] ;
b = atoms2 [ j ] ;
dx = a . x - b . x ;
dy = a . y - b . y ;
d = Math . sqrt ( dx * dx + dy * dy ) ;
if ( d > 0 && d < 80 ) {
F = ( g * 1 ) / d ;
fx += F * dx ;
fy += F * dy ;
}
}
a . vx = ( a . vx + fx ) * 0.5 ;
a . vy = ( a . vy + fy ) * 0.5 ;
a . x += a . vx ;
a . y += a . vy ;
if ( a . x <= 0 || a . x >= 500 ) { a . vx *= - 1 ; }
if ( a . y <= 0 || a . y >= 500 ) { a . vy *= - 1 ; }
}
} ;
yellow = create ( 200 , "yellow" ) ;
red = create ( 200 , "red" ) ;
green = create ( 200 , "green" ) ;
update = ( ) => {
rule ( green , green , - 0.32 ) ;
rule ( green , red , - 0.17 ) ;
rule ( green , yellow , 0.34 ) ;
rule ( red , red , - 0.1 ) ;
rule ( red , green , - 0.34 ) ;
rule ( yellow , yellow , 0.15 ) ;
rule ( yellow , green , - 0.2 ) ;
m . clearRect ( 0 , 0 , 500 , 500 ) ;
draw ( 0 , 0 , "black" , 500 ) ;
for ( i = 0 ; i < atoms . length ; i ++ ) {
draw ( atoms [ i ] . x , atoms [ i ] . y , atoms [ i ] . color , 5 ) ;
}
requestAnimationFrame ( update ) ;
} ;
update ( ) ;
</ script >
Partikel-Lebenssimulation, Ursuppe – Evolution, Conways Spiel des Lebens, Zelluläre Automaten, Selbstorganisierende Muster,
Dieses Projekt wurde inspiriert von: Jeffery Ventrellas Clusters http://www.ventrella.com/Clusters/. Ich habe keinen Zugriff auf Ventrellas Code, aber ich denke, der Hauptunterschied dieses Projekts zu den anderen Partikellebensprojekten besteht darin, dass ich keine Kollisionserkennung implementiert habe und dies die Simulation Tausender Partikel in Echtzeit ermöglichte. Außerdem habe ich GUI-Steuerelemente hinzugefügt, um die Parameter in Echtzeit zu ändern und eine einfache Feinabstimmung und Erkundung zu ermöglichen. Dadurch konnte ich einige noch nie dagewesene Muster entdecken, die sich aus einigen extrem einfachen Beziehungsmodellen ergeben. Der Code hier ist wahrscheinlich um eine Größenordnung einfacher als alle anderen Codes für künstliches Leben, da ich diesen Code ausschließlich als Lehrmaterial für Nicht-Programmierer und das allgemeine Publikum begonnen habe, um zu beweisen, dass Komplexität aus Einfachheit entstehen kann.