Tecnología "Particle Life"
(github.com/hunar4321)- Particle Life Simulation es una simulación primitiva de vida artificial que crea patrones complejos de autoorganización mediante reglas simples de atracción y repulsión entre partículas similares a átomos
- Excluyendo la GUI, el código ocupa menos de una página, y el algoritmo central de la implementación en C++ está en las primeras 100 líneas de
/particle_life/src/ofApp.cpp - La demo en JavaScript está disponible en versiones 2D y 3D, y el README incluye un ejemplo que crea 200 partículas amarillas, rojas y verdes en un canvas de 500x500 y aplica reglas de fuerza entre grupos de colores
- Para encontrar patrones interesantes, se recomienda usar búsqueda aleatoria y ajustes finos graduales más que parámetros exactos; de vez en cuando se pueden hacer cambios grandes en los parámetros para evitar quedar atrapado en máximos locales
- La limitación actual es que la complejidad computacional es de tiempo cuadrático debido al bucle anidado que calcula la distancia entre todos los pares de partículas; quedan como tareas pendientes el cómputo paralelo en GPU, guardar parámetros, ampliar los tipos de partículas y una UI más intuitiva
Propósito de Particle Life Simulation
- Particle Life Simulation es un programa que simula patrones primitivos de vida artificial aplicando reglas simples de atracción o repulsión entre partículas similares a átomos
- Se enfoca en mostrar cómo, a partir de reglas simples, pueden aparecer patrones complejos de autoorganización y similares a la vida
- Excluyendo los elementos de la GUI, el código ocupa menos de una página
- El tutorial y el walkthrough están disponibles como video de YouTube
Demos y forma de ejecución
- Hay demos online en JavaScript disponibles en 2D y 3D
- La versión en C++ se ejecuta descargando el repositorio, descomprimiéndolo y ejecutando
particle_life.exeen la carpeta/particle_life/bin/ - El README incluye una imagen de la interfaz de la versión en C++ e imágenes con resultados de ejemplo
Forma de explorar patrones
- No hace falta ajustar los parámetros con exactitud para reproducir patrones interesantes
- El mejor método es primero probar una búsqueda aleatoria de parámetros y, cuando se encuentra un patrón interesante, hacer ajustes finos graduales
- Para no quedar atrapado en máximos locales, se pueden hacer de vez en cuando saltos grandes en los parámetros
- Con este enfoque pueden seguir apareciendo patrones distintos e interesantes
Código y estructura de implementación
- El código fuente está disponible en C++, JavaScript y Python
- Para contribuir al programa en C++, el algoritmo central está en las primeras 100 líneas de
/particle_life/src/ofApp.cpp- El resto corresponde a componentes de GUI y control de renderizado
- La GUI y el renderizado los proporciona la biblioteca openFrameworks
- Forma de compilar en C++
- Descargar el repositorio
- Descargar openFrameworks
- Importar la carpeta
/particle_life/al proyecto conprojectGeneratorde openFrameworks - O crear un nuevo proyecto de openFrameworks, agregar
ofxGuiy luego reemplazar la carpeta/src/del proyecto generado por la carpeta/src/del repositorio - Después se puede compilar el código C++ en la máquina local
Cómo funciona el ejemplo en JavaScript
- El ejemplo en JavaScript del README funciona en un
canvasde 500x500 atomse crea como un objeto conx,y,vx,vyycolor- La función
createcrea un grupo de partículas del mismo color en la cantidad especificada y también las agrega al arreglo globalatoms rule(atoms1, atoms2, g)calcula la fuerza entre dos grupos de partículas- Solo aplica la fuerza cuando la distancia
dentre dos partículas es mayor que 0 y menor que 80 - La fuerza se calcula como
(g * 1) / d - El valor de
gdetermina la regla de atracción o repulsión entre grupos de colores
- Solo aplica la fuerza cuando la distancia
- El ejemplo genera 200 partículas de cada color: amarillo, rojo y verde
updateaplica las reglas para cada combinación de grupos de colores, limpia la pantalla y vuelve a dibujar las partículas sobre un fondo negro- Ejecuta el loop de animación con
requestAnimationFrame(update) - La versión más optimizada está en el archivo
particle_life.html
Otros ports
Temas relacionados e inspiración
- Los temas relacionados son Particle Life Simulation, Primordial Soup - Evolution, Conway's game of life, Cellular automata y Self organizing patterns
- Este proyecto se inspiró en Clusters de Jeffery Ventrella
- No se pudo acceder al código de Ventrella
- Se estima que la principal diferencia es que no se implementó detección de colisiones
- Se considera que, al omitir la detección de colisiones, fue posible simular miles de partículas en tiempo real
- Se agregaron controles de GUI para poder cambiar los parámetros en tiempo real
- Esto facilita el ajuste fino y la exploración
- Con este enfoque pudieron aparecer patrones nunca vistos antes a partir de un modelo de relaciones muy simple
- El código comenzó como material educativo para no programadores y público general
- Su objetivo es mostrar que la complejidad puede surgir de la simplicidad
- Se considera posible que sea aún más simple, en escala de un solo dígito, entre los códigos de vida artificial
Tareas pendientes
- Agregar funciones para guardar y cargar parámetros, de modo que los usuarios puedan compartir fácilmente modelos interesantes
- Permitir agregar más tipos de partículas, actualmente fijos en 4
- El mayor cuello de botella es el bucle anidado que calcula la distancia entre todos los pares de partículas
- La complejidad computacional pasa a ser de tiempo cuadrático
- Se necesita una forma de evitarlo
- El cálculo de distancias entre pares de partículas es fácil de paralelizar, por lo que podría hacerse en la GPU
- Se necesita una función para cambiar el tamaño de la pantalla y mejorar la verificación de bordes
- Muchas partículas que se mueven rápido pueden salirse de los límites de la pantalla
- Agregar una UI más intuitiva para permitir un control más preciso de los parámetros
- Se podría agregar un botón de aleatorización o una metarregla simple que modifique recursivamente las reglas iniciales de forma continua
- El objetivo es que los patrones sigan cambiando sin quedar atrapados en máximos locales
- Se podrían usar algoritmos evolutivos como una mejor forma de seleccionar y optimizar parámetros
- Para eso habría que escribir una función de aptitud
- Actualmente no está claro qué sería una función de aptitud en el dominio de este programa
- En el mundo real, la función de aptitud es la competencia y la supervivencia del más apto
- Aquí, el usuario ajusta finamente y selecciona parámetros que producen patrones interesantes, pero “interesante” es difícil de definir
1 comentarios
Comentarios en Hacker News
Es bastante divertido ver qué “facción” termina dominando el tablero
Demo: https://genetic-life.surge.sh/
Código fuente: lo porté del C++ original a Rust/WASM https://github.com/franky47/genetic-life
Al final se estabiliza en un bulto grande e inestable y otro estable, y como ninguno de los dos se mueve, ahí termina todo
Pero antes de eso sí mostró la escena que esperaba: objetos encontrándose y fusionándose
Esto está realmente divertido. Tiene mucho movimiento y buenas formas
Sorprende que con estos parámetros se formen tan fácilmente cosas parecidas a pequeñas formas de vida incluso a una escala muy pequeña
Algunas personas creen que los parámetros del universo real están ajustados para que la vida surja fácilmente, pero más bien da la impresión de que están ajustados para dificultar la formación de vida
Lo engañoso es el movimiento. Este sistema no tiene leyes de conservación integradas, así que el movimiento se mantiene. Si formas un par A-B donde B es atraído por A y A repele a B, simplemente sale disparado
Si se hubiera diseñado para que las leyes de conservación, como la conservación de energía o de momento, quedaran incluidas en las reglas, probablemente habría dado como resultado algo mucho menos interesante y más parecido a las estructuras que se ven en las etapas tardías de una explosión de pentominó en el Juego de la vida de Conway
Si hubiera un procesador lo bastante grande, me gustaría ver esto en 3D, y probar también opciones donde la fuerza decaiga con el inverso de r, con el inverso del cubo de r, o con r * log(r), o partículas del tipo “repelen a larga distancia y atraen a muy corta distancia”. Incluso con una optimización inteligente, me da la impresión de que un sistema así terminaría deteniéndose
Código fuente: https://github.com/ath92/particle-life
Esta versión hace todo el trabajo en shaders de WebGL y guarda el estado de la simulación en texturas y uniforms
Gracias a eso puede simular y dibujar más partículas, pero usa extensiones de WebGL menos compatibles, así que puede que no corra en todos los dispositivos
Particle Life Emerges from Simplicity - https://news.ycombinator.com/item?id=34156592 - diciembre de 2022, 1 comentario
Particle Life Simulation - https://news.ycombinator.com/item?id=33680845 - noviembre de 2022, 1 comentario
Particle Life - https://news.ycombinator.com/item?id=21875720 - diciembre de 2019, 7 comentarios
Si te interesa, está aquí: https://github.com/jasonjmcghee/compute-shaders
Es decir, en CGoL las reglas se aplican a posiciones de la cuadrícula, no a objetos que se desplazan por la cuadrícula. Me pregunto si este sistema también podría construirse de una forma basada en ondas
Además, en este sistema cada cuadro todas las partículas interactúan entre sí sin importar la distancia, así que la velocidad de la luz parece infinita. En cambio, en CGoL cada célula solo puede influir en sus vecinas inmediatas en cada cuadro, así que existe una especie de velocidad de la luz
Me pregunto si alguna vez pensaron en añadir soporte para shaders. Me gustaría ver una versión más lenta y con una sensación más “grumosa” en pantalla completa
Probablemente convertiría mi Mac en un calefactor, pero ahorita eso hasta sería una ventaja ;)
https://www.youtube.com/watch?v=BpN-DE3o6u8
https://bingdev.binghamton.edu/sayama/SwarmChemistry/
En particular, Lenia tiene algunas variantes más complejas; en relación con este tema, se me vienen a la mente “Flow Lenia” y “Particle Lenia”