1 pontos por GN⁺ 2023-12-30 | 1 comentários | Compartilhar no WhatsApp

Simulação de vida de partículas

  • Um programa simples que simula vida artificial primitiva usando regras simples de atração e repulsão entre partículas, como átomos.
  • Excluindo os elementos de GUI, o código tem menos de uma página.
  • É possível conferir abaixo o tutorial em vídeo e as instruções.

Saiba mais (tutorial em vídeo no YouTube)

  • Link para o tutorial em vídeo no YouTube.

Demo online (versão em JavaScript)

  • Links para demos ao vivo em 2D e 3D.

Interface (versão em C++)

Exemplo de resultado

Alguns padrões interessantes que podem ser reproduzidos

  • Não é necessário fazer os parâmetros coincidirem exatamente para reproduzir esses padrões.
  • A melhor forma de obter padrões interessantes é primeiro tentar explorar parâmetros aleatórios.
  • Ao encontrar um padrão interessante, tente fazer ajustes finos gradualmente.
  • De vez em quando, é possível dar grandes saltos nos parâmetros para não ficar preso em máximos locais.

Como usar

  • Baixe este repositório, extraia-o, vá até a pasta /particle_life/bin/ e então clique em particle_life.exe.

Código

  • O código-fonte é fornecido em C++, JavaScript e Python.
  • Link para o tutorial em vídeo no YouTube.
  • Se você quiser contribuir com o programa em C++, o algoritmo principal está nas primeiras 100 linhas de "/particle_life/src/ofApp.cpp".
  • O restante são componentes de GUI e controles de renderização fornecidos pela biblioteca openFrameworks.
  • Para começar, baixe este repositório e a biblioteca openFrameworks, e use o projectGenerator do openFrameworks para importar a pasta /particle_life/ para o projeto.
  • Ou crie um novo projeto openFrameworks, adicione ofxGui e depois substitua os arquivos de projeto gerados pela pasta /src/ fornecida aqui.
  • Agora é possível compilar o código C++.

Outras portas

  • É fornecida uma lista de versões portadas para várias linguagens, como Godot, Rust, Go-1, Go-2, Go-3, Python, Lua, QB64-PE, WebGL, Java, C# Winforms, FreeBasic e outras.

Exemplo de código JavaScript

  • É possível conferir um exemplo de código JavaScript e a versão otimizada no arquivo particle_life.html.

Tópicos relacionados

  • Explicações sobre simulação de vida de partículas, sopa primordial - evolução, Jogo da Vida de Conway, autômatos celulares, padrões auto-organizados e outros temas.
  • Este projeto foi inspirado em Clusters, de Jeffery Ventrella, e por não implementar detecção de colisão, conseguiu simular milhares de partículas em tempo real.
  • Ao adicionar controles de GUI para permitir ajuste fino e exploração de parâmetros em tempo real com facilidade, surgem padrões nunca antes vistos a partir de um modelo de relações extremamente simples.
  • Este código começou como material educacional e é voltado para não programadores e para o público em geral, para demonstrar que a complexidade pode surgir da simplicidade.

Lista de tarefas

  1. Adicionar uma função para salvar e carregar parâmetros (para que as pessoas possam compartilhar modelos interessantes com facilidade)
  2. Função para adicionar mais tipos de partículas (atualmente está fixo em quatro tipos de partículas)
  3. O maior gargalo atualmente é o loop for aninhado que calcula as distâncias par a par entre todas as partículas, com complexidade computacional quadrática.
  4. Como alternativa ao item 3, o cálculo das distâncias par a par é paralelizável o suficiente para ser executado na GPU.
  5. Adicionar uma função para redimensionar o tamanho da tela e melhorar a verificação de limites (partículas com muitos movimentos rápidos podem sair dos limites da tela).
  6. Adicionar uma UI mais intuitiva que permita controle mais detalhado dos parâmetros.
  7. Adicionar um botão aleatório ou, melhor ainda, introduzir uma meta-regra simples que altere continuamente as regras iniciais, para que os padrões não fiquem presos em máximos locais e continuem mudando.
  8. Uma abordagem melhor seria usar um algoritmo evolutivo para selecionar e otimizar parâmetros, mas para isso seria necessário escrever uma função de aptidão. No momento, não se sabe qual seria a função de aptidão no domínio deste programa.

Opinião do GN⁺

  • Este projeto tem grande valor ao mostrar visualmente como fenômenos complexos de vida podem emergir de regras simples.
  • Pode ser um material introdutório interessante para engenheiros de software iniciantes com interesse em programação e pesquisa em vida artificial.
  • Como há versões portadas para várias linguagens, isso pode ajudar a ampliar a compreensão sobre diferentes linguagens de programação.

1 comentários

 
GN⁺ 2023-12-30
Comentários do Hacker News
  • Na escola, fiz o Jogo da Vida de Conway como meu primeiro projeto de programação, mas preto e branco era sem graça, então introduzi "genes" RGB e adicionei mutações combinando as cores dos pais. Foi divertido ver as "facções" dominando o tabuleiro.
  • O resultado mais interessante foi que, por um tempo, se formavam grandes massas instáveis e massas estáveis, e então tudo parava nesse estado. Antes disso, observei os objetos se encontrando e se fundindo, como era esperado.
  • Fiz algo parecido recentemente, mas esta versão processa tudo em shaders WebGL e mantém o estado da simulação em texturas/uniforms. Ela consegue simular e renderizar mais partículas, mas pode não rodar em todos os dispositivos porque usa algumas extensões do WebGL que não são suportadas em todo lugar.
  • Esta é uma versão mais complexa do Jogo da Vida de John Conway, e é surpreendente como formas parecidas com vida se formam facilmente em pequena escala, enquanto os parâmetros do nosso universo parecem tornar a formação de vida mais difícil.
  • Links relacionados:
  • Misturar "genes" coloridos ao Jogo da Vida de Conway é como programar com uma paleta de arco-íris, e as massas parecem encenar seus próprios pequenos dramas antes de simplesmente descansarem. A simulação produz movimentos e formas incríveis, como um mini filme de super-heróis com formas no lugar de personagens.
  • Comecei um experimento 3D chamado "Altphy", mas ele é complexo demais para processamento em tempo real, então não funciona como eu pretendia. Estou compartilhando porque parece que partes do código ou das ideias podem evoluir no futuro.
  • Tentei fazer algo semelhante no Godot 4 usando compute shaders. Se tiver interesse, recomendo dar uma olhada.
  • Estou vendo a versão 3D em JS, e isso pode acabar sendo minha coisa favorita desde o Jogo da Vida de Conway original ou o protetor de tela Primordial Life dos anos 90. Sugiro considerar adicionar suporte a shaders. Eu adoraria ver uma versão lenta e "mais amorfa" rodando em tela cheia. Talvez isso transforme um Mac em aquecedor, mas, por enquanto, isso também é um bônus.
  • Trabalho muito legal, mas é uma pena eu não conseguir rodar isso na TV da parede. Eu entendi "Particle Life" como se fosse uma marca de camisetas para físicos, e esperava slogans nas camisetas como: "Depois de ouvir você, sinto que você não passa de uma vibração azarada em um campo quântico, então me sinto justificado em ignorar tudo o que você diz".