Un programa simple para simular vida artificial primitiva usando reglas simples de atracción o repulsión entre partículas similares a átomos, produciendo patrones complejos y autoorganizados similares a la vida. Excluyendo los elementos de la GUI, el código tiene menos de una página. El vídeo tutorial y el tutorial están disponibles a continuación.
https://youtu.be/0Kx4Y9TVMGg
Haga clic aquí para ver una demostración en vivo (JavaScript):
No es necesario ser exacto con los parámetros para reproducir estos patrones. La mejor manera de obtener patrones interesantes es intentar primero exploraciones de parámetros aleatorios; una vez que encuentre un patrón interesante, intente ajustarlo gradualmente. Para evitar quedarse atascado en un máximo local, puede realizar algunos grandes saltos ocasionales en los parámetros. De esta manera seguirán apareciendo patrones interesantes y diferentes.
Descarga este repositorio. descomprima el archivo, luego vaya a la carpeta /particle_life/bin/ y haga clic en partícula_life.exe
El código fuente está disponible en C++, JavaScript y Python. Mire este video de YouTube para ver un tutorial: https://youtu.be/0Kx4Y9TVMGg
Si desea contribuir al programa C++, el algoritmo central son las primeras 100 líneas de código en: "/particle_life/src/ofApp.cpp". El resto son componentes GUI y controles de renderizado proporcionados por la biblioteca openFrameworks, una biblioteca de renderizado de imágenes de código abierto y fácil de usar.
Para comenzar, descargue este repositorio y luego descargue la biblioteca openFrameworks desde aquí: https://openframeworks.cc/. Utilice el projectGenerator de openFramework e importe la carpeta /particle_life/ al proyecto.
Alternativamente, genere un nuevo proyecto openFramework y agregue ofxGui. Una vez que se generen los archivos del proyecto, reemplace la carpeta /src/ con la que se proporciona aquí.
Ahora puede compilar el código C++ en su máquina.
Además, consulte el archivo partícula_life.html para obtener una versión más optimizada, gracias a quienes han contribuido.
< 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 >
Simulación de vida de partículas, Sopa primordial: evolución, El juego de la vida de Conway, Autómatas celulares, Patrones de autoorganización,
Este proyecto se inspiró en: Clusters de Jeffery Ventrella http://www.ventrella.com/Clusters/. No tengo acceso al código de Ventrella, pero supongo que la principal diferencia de este proyecto con respecto a otros proyectos de vida de partículas es que no implementé la detección de colisiones y esto hizo posible la simulación de miles de partículas en tiempo real. Además, agregué controles GUI para cambiar los parámetros en tiempo real, lo que permite un fácil ajuste y exploración, por lo tanto, pude encontrar algunos patrones nunca antes vistos que surgen de algunos modelos de relaciones extremadamente simples. El código aquí es probablemente un orden de magnitud más simple que cualquier otro código de Vida Artificial porque comencé este código únicamente como material educativo para no programadores y audiencia en general para demostrar que la complejidad puede surgir de la simplicidad.