1 puntos por GN⁺ 2023-12-30 | 1 comentarios | Compartir por WhatsApp
  • 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.exe en 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 con projectGenerator de openFrameworks
    • O crear un nuevo proyecto de openFrameworks, agregar ofxGui y 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 canvas de 500x500
  • atom se crea como un objeto con x, y, vx, vy y color
  • La función create crea un grupo de partículas del mismo color en la cantidad especificada y también las agrega al arreglo global atoms
  • rule(atoms1, atoms2, g) calcula la fuerza entre dos grupos de partículas
    • Solo aplica la fuerza cuando la distancia d entre dos partículas es mayor que 0 y menor que 80
    • La fuerza se calcula como (g * 1) / d
    • El valor de g determina la regla de atracción o repulsión entre grupos de colores
  • El ejemplo genera 200 partículas de cada color: amarillo, rojo y verde
  • update aplica 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

 
GN⁺ 2023-12-30
Comentarios en Hacker News
  • Uno de los primeros proyectos de programación que hice en la escuela fue el Juego de la vida de Conway, pero el blanco y negro me parecía algo aburrido, así que le metí “genes” RGB, hice que las células recién nacidas heredaran una mezcla de los colores de sus padres y también añadí mutaciones aleatorias
    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
  • De las cosas que he generado, esta fue la más interesante: https://hunar4321.github.io/particle-life/particle_life.html...
    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
  • Está realmente interesante. Parece una versión más compleja que el Juego de la vida de John Conway
    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
    • Eso se parece más a una molécula que a un ser vivo. Aunque, claro, cuando un conjunto complejo de reglas se acerca a un estado estacionario, alguna vez lo imaginé como un imperio estelar lejano con colores asignados según sistemas de gobierno
      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
    • Eso tampoco significa que haya razones para creer que la vida sea especialmente rara en el universo
  • Casualidad divertida: hace poco hice algo parecido: https://webgl-particle-life.netlify.app/
    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
  • Publicaciones relacionadas:
    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
  • Esta implementación está mucho más pulida, pero hace tiempo probé hacer algo con compute shaders en Godot 4
    Si te interesa, está aquí: https://github.com/jasonjmcghee/compute-shaders
  • Nunca lo había pensado así, pero al compararlos me doy cuenta de que el Juego de la vida de Conway es más basado en ondas que en partículas
    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
  • Ahora mismo estoy viendo la versión 3D en JS, y quizá sea lo que más me ha gustado desde el Juego de la vida de Conway original o el protector de pantalla Primordial Life de los 90
    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 ;)
  • Me recuerda a Swarm Chemistry de Hiroki Sayama
    https://www.youtube.com/watch?v=BpN-DE3o6u8
    https://bingdev.binghamton.edu/sayama/SwarmChemistry/
  • Si te interesa más este tipo de cosas, recomiendo Smooth-life y Lenia
    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”