1 puntos por GN⁺ 2023-12-30 | 1 comentarios | Compartir por WhatsApp

Simulación de vida de partículas

  • Un programa simple que simula vida artificial primitiva usando reglas sencillas de atracción y repulsión entre partículas, como si fueran átomos.
  • Excluyendo los elementos de la GUI, el código ocupa menos de una página.
  • A continuación se pueden consultar el tutorial en video y la guía.

Más información (tutorial en video de YouTube)

  • Se proporciona un enlace al tutorial en video de YouTube.

Demo en línea (versión JavaScript)

  • Se proporcionan enlaces a demos en vivo en 2D y 3D.

Interfaz (versión C++)

Resultados de ejemplo

Algunos patrones interesantes que se pueden reproducir

  • No es necesario hacer coincidir los parámetros con exactitud para reproducir estos patrones.
  • La mejor manera de obtener patrones interesantes es probar primero una exploración aleatoria de parámetros.
  • Si encuentras un patrón interesante, intenta ajustarlo poco a poco.
  • De vez en cuando puedes hacer saltos grandes en los parámetros para evitar quedarte en un máximo local.

Cómo usarlo

  • Descarga este repositorio, descomprímelo, ve a la carpeta /particle_life/bin/ y luego haz clic en particle_life.exe.

Código

  • El código fuente está disponible en C++, JavaScript y Python.
  • Se proporciona un enlace al tutorial en video de YouTube.
  • Si quieres contribuir al programa en C++, el algoritmo central está en las primeras 100 líneas de "/particle_life/src/ofApp.cpp".
  • El resto son componentes de GUI y controles de renderizado proporcionados por la biblioteca openFrameworks.
  • Para comenzar, descarga este repositorio y la biblioteca openFrameworks, y usa el projectGenerator de openFrameworks para importar la carpeta /particle_life/ al proyecto.
  • O bien, crea un proyecto nuevo de openFrameworks y agrega ofxGui; luego reemplaza los archivos del proyecto generado con la carpeta /src/ proporcionada aquí.
  • Ahora ya puedes compilar el código en C++.

Otros ports

  • Se proporciona una lista de versiones portadas a varios lenguajes, como Godot, Rust, Go-1, Go-2, Go-3, Python, Lua, QB64-PE, WebGL, Java, C# Winforms, FreeBasic y otros.

Ejemplo de código JavaScript

  • Puedes consultar un ejemplo de código JavaScript y la versión optimizada en el archivo particle_life.html.

Temas relacionados

  • Explicación sobre simulación de vida de partículas, sopa primordial - evolución, el Juego de la Vida de Conway, autómatas celulares, patrones autoorganizados y más.
  • Este proyecto se inspiró en Clusters de Jeffery Ventrella, y al no implementar detección de colisiones pudo simular miles de partículas en tiempo real.
  • Al agregar controles de GUI para ajustar y explorar parámetros fácilmente en tiempo real, comenzaron a aparecer patrones nunca antes vistos a partir de un modelo relacional muy simple.
  • Este código comenzó como material educativo y está dirigido a personas no programadoras y al público general, para demostrar que la complejidad puede surgir de la simplicidad.

Lista de tareas

  1. Agregar una función para guardar y cargar parámetros (para que la gente pueda compartir modelos interesantes fácilmente)
  2. Capacidad de agregar más tipos de partículas (actualmente está fijo en cuatro tipos de partículas)
  3. El mayor cuello de botella actual es el bucle for anidado que calcula las distancias por pares entre todas las partículas, por lo que la complejidad computacional es cuadrática.
  4. Como alternativa al punto 3, el cálculo de distancias por pares es lo bastante paralelizable como para ejecutarse en la GPU.
  5. Agregar una función para ajustar el tamaño de la pantalla y mejorar la verificación de límites (muchas partículas con movimientos rápidos pueden salirse de los bordes de la pantalla).
  6. Agregar una UI más intuitiva que permita un control más fino de los parámetros.
  7. Agregar un botón aleatorio o, mejor aún, una meta-regla simple que cambie continuamente las reglas iniciales, para que los patrones sigan evolucionando en lugar de quedarse en un máximo local.
  8. Una mejor forma de seleccionar y optimizar parámetros sería usar un algoritmo evolutivo, pero para eso habría que escribir una función de aptitud. Actualmente no se sabe cuál sería una función de aptitud adecuada en el contexto de este programa.

Opinión de GN⁺

  • Este proyecto tiene gran valor para mostrar visualmente cómo fenómenos complejos similares a la vida pueden surgir a partir de reglas simples.
  • Puede ser un material de introducción interesante para ingenieros de software principiantes con interés en programación e investigación sobre vida artificial.
  • Como existen versiones portadas a varios lenguajes, también puede ayudar a ampliar la comprensión de distintos lenguajes de programación.

1 comentarios

 
GN⁺ 2023-12-30
Comentarios de Hacker News
  • Mi primer proyecto de programación en la escuela fue el Juego de la Vida de Conway, pero el blanco y negro me parecía aburrido, así que introduje "genes" RGB y les apliqué mutaciones combinando los colores de los padres. Es divertido ver las "facciones" que toman control del tablero.
  • El resultado más interesante fue que, durante un tiempo, se formaban masas grandes e inestables junto con masas estables, y luego se detenían en ese estado. Antes de eso, se observaba el fenómeno esperado de objetos encontrándose y fusionándose.
  • Hace poco hice algo parecido; esta versión procesa todo con shaders de WebGL y mantiene el estado de la simulación en texturas/uniforms. Puede simular y dibujar más partículas, pero como usa algunas extensiones de WebGL no compatibles, puede que no funcione en todos los dispositivos.
  • Esta es una versión más compleja que el Juego de la Vida de John Conway, y sorprende lo fácilmente que se forman estructuras parecidas a la vida a pequeña escala; parece que los parámetros de nuestro universo hacen que la formación de vida sea difícil.
  • Enlaces relacionados:
  • Mezclar "genes" coloridos en el Juego de la Vida de Conway es como programar con una paleta arcoíris, y las masas parecen montar su propio pequeño drama antes de simplemente quedarse en reposo. En la simulación aparecen movimientos y formas geniales, como una mini película de superhéroes con formas en lugar de personajes.
  • Empecé un experimento 3D llamado "Altphy", pero es demasiado complejo para procesarlo en tiempo real y no funciona como pretendía. Lo comparto porque siento que parte del código o de las ideas podrían evolucionar algún día.
  • Intenté hacer algo similar en Godot 4 usando compute shaders. Si te interesa, recomiendo echarle un vistazo.
  • Estoy viendo la versión 3D en JS, y esto podría ser de lo que más me ha gustado desde el Juego de la Vida original de Conway o el salvapantallas Primordial Life de los 90. Sugeriría considerar agregar soporte para shaders. Me gustaría ver una versión lenta y "más blobs" ejecutándose en pantalla completa. Tal vez convierta una Mac en calefactor, pero por ahora eso también sería un bonus.
  • Trabajo muy genial, aunque da pena no poder ejecutarlo en una TV colgada en la pared. Entendí "Particle Life" como si fuera una marca de camisetas para físicos, y esperaba eslóganes en las camisetas como: "Después de escucharte, siento que no eres más que una desafortunada vibración en un campo cuántico, así que me parece justificado ignorar todo lo que dices".