A tecnologia "Particle Life"
(github.com/hunar4321)- Particle Life Simulation é uma simulação primitiva de vida artificial que cria padrões complexos de auto-organização com regras simples de atração e repulsão entre partículas semelhantes a átomos
- Excluindo a GUI, o código tem menos de uma página, e o algoritmo central da implementação em C++ está nas primeiras 100 linhas de
/particle_life/src/ofApp.cpp - A demo em JavaScript é oferecida em versões 2D e 3D, e o README inclui um exemplo que cria 200 partículas amarelas, vermelhas e verdes em um canvas 500x500 e aplica regras de força entre os grupos de cores
- Para encontrar padrões interessantes, recomenda-se exploração aleatória seguida de ajuste fino gradual, em vez de buscar parâmetros exatos, e mudanças grandes ocasionais nos parâmetros podem ajudar a evitar ficar preso em máximos locais
- A limitação atual é que a complexidade computacional se torna quadrática devido ao loop aninhado que calcula a distância entre todos os pares de partículas; computação paralela em GPU, salvamento de parâmetros, expansão dos tipos de partículas e uma UI mais intuitiva continuam como tarefas pendentes
Objetivo do Particle Life Simulation
- Particle Life Simulation é um programa que simula padrões primitivos de vida artificial aplicando regras simples de atração ou repulsão entre partículas semelhantes a átomos
- O foco é mostrar como regras simples podem gerar auto-organização complexa e padrões semelhantes aos da vida
- Excluindo os elementos de GUI, o código tem menos de uma página
- Tutoriais e walkthroughs são oferecidos em vídeos no YouTube
Demos e forma de execução
- Há demos online em JavaScript nas versões 2D e 3D
- A versão em C++ funciona baixando o repositório, descompactando-o e executando
particle_life.exena pasta/particle_life/bin/ - O README inclui imagens da interface da versão em C++ e imagens de resultados de exemplo
Forma de explorar padrões
- Não é necessário acertar os parâmetros com precisão para reproduzir padrões interessantes
- A melhor forma é tentar primeiro uma exploração aleatória de parâmetros e, ao encontrar um padrão interessante, fazer ajustes finos gradualmente
- Para evitar ficar preso em máximos locais, pode-se dar saltos grandes nos parâmetros de vez em quando
- Dessa forma, padrões diferentes e interessantes podem continuar surgindo
Código e estrutura de implementação
- O código-fonte é fornecido em C++, JavaScript e Python
- Para contribuir com o programa em C++, o algoritmo central está nas primeiras 100 linhas de
/particle_life/src/ofApp.cpp- O restante são componentes de GUI e controle de renderização
- A GUI e a renderização são fornecidas pela biblioteca openFrameworks
- Forma de build em C++
- Baixe o repositório
- Baixe o openFrameworks
- Importe a pasta
/particle_life/para o projeto com oprojectGeneratordo openFrameworks - Ou crie um novo projeto openFrameworks, adicione
ofxGuie depois substitua a pasta/src/do projeto gerado pela/src/do repositório - Depois disso, é possível compilar o código C++ na máquina local
Como funciona o exemplo em JavaScript
- O exemplo em JavaScript do README roda em um
canvas500x500 atomé criado como um objeto comx,y,vx,vy,color- A função
createcria um grupo de partículas da mesma cor na quantidade especificada e também o adiciona ao array globalatoms rule(atoms1, atoms2, g)calcula a força entre dois grupos de partículas- A força só é aplicada quando a distância
dentre duas partículas é maior que 0 e menor que 80 - A força é calculada como
(g * 1) / d - O valor de
gdefine as regras de atração ou repulsão entre os grupos de cores
- A força só é aplicada quando a distância
- O exemplo cria 200 partículas amarelas, vermelhas e verdes, respectivamente
updateaplica as regras para cada combinação de grupos de cores, limpa a tela e redesenha as partículas sobre um fundo preto- O loop de animação é executado com
requestAnimationFrame(update) - Uma versão mais otimizada está no arquivo
particle_life.html
Outros ports
Tópicos relacionados e inspiração
- Os tópicos relacionados são Particle Life Simulation, Primordial Soup - Evolution, Conway's game of life, Cellular automata, Self organizing patterns
- Este projeto foi inspirado em Clusters, de Jeffery Ventrella
- Não foi possível acessar o código de Ventrella
- Presume-se que a principal diferença seja a ausência de detecção de colisão
- Ao remover a detecção de colisão, acredita-se que foi possível simular milhares de partículas em tempo real
- Controles de GUI foram adicionados para permitir alterar parâmetros em tempo real
- Isso facilita o ajuste fino e a exploração
- Padrões nunca vistos antes puderam surgir a partir de um modelo de relações muito simples
- O código começou como material educacional para não programadores e para o público em geral
- O objetivo era mostrar que a complexidade pode surgir da simplicidade
- Considera-se possível que esteja entre os códigos de vida artificial mais simples, em escala de um dígito
Tarefas pendentes
- Adicionar uma função para salvar e carregar parâmetros, permitindo que usuários compartilhem facilmente modelos interessantes
- Permitir adicionar mais tipos de partículas, hoje fixados em 4
- O maior gargalo é o loop aninhado que calcula a distância entre todos os pares de partículas
- A complexidade computacional se torna quadrática
- É necessário encontrar uma forma de contornar isso
- Como o cálculo de distância entre pares de partículas é fácil de paralelizar, ele pode ser executado na GPU
- São necessários recurso de redimensionamento de tela e melhorias na verificação de limites
- Muitas partículas se movendo rapidamente podem sair da área da tela
- Adicionar uma UI mais intuitiva para permitir controle mais preciso dos parâmetros
- Pode-se adicionar um botão de randomização ou uma regra meta simples que continue mutando recursivamente as regras iniciais
- O objetivo é fazer com que os padrões continuem mudando sem ficar presos em máximos locais
- Um algoritmo evolutivo pode ser usado como forma melhor de selecionar e otimizar parâmetros
- Para isso, seria necessário escrever uma função de fitness
- No momento, não está claro o que seria uma função de fitness nesse domínio do programa
- No mundo real, a função de fitness é competição e sobrevivência do mais apto
- Aqui, o usuário ajusta e seleciona parâmetros que criam padrões interessantes, mas é difícil definir “interessante”
1 comentários
Opiniões no Hacker News
É bem divertido ver qual “facção” domina o tabuleiro
Demo: https://genetic-life.surge.sh/
Fonte: era originalmente em C++, portado para Rust/WASM https://github.com/franky47/genetic-life
No fim, ela se acomoda em um aglomerado grande e instável e outro estável; ambos param de se mover, e aí acaba
Mas, antes disso, mostra a cena que eu esperava: objetos se encontrando e se fundindo
Este é realmente divertido. Tem bastante movimento e formas boas
É surpreendente como, com esses parâmetros, coisas que lembram pequenos seres vivos se formam facilmente até em escalas muito pequenas
Algumas pessoas acham que os parâmetros do universo real foram ajustados para facilitar o surgimento da vida, mas, para mim, parece mais que foram ajustados para dificultar a formação da vida
O que engana é o movimento. Como este sistema não tem leis de conservação embutidas, o movimento se mantém. Se você criar um par A-B em que B é atraído por A e A repele B, ele simplesmente sai voando
Se as regras tivessem sido projetadas para incluir leis de conservação, como conservação de energia ou de momento, as estruturas resultantes seriam muito menos interessantes e mais parecidas com o estágio avançado da explosão de um pentominó no Jogo da Vida de Conway
Se eu tivesse um processador grande o suficiente, gostaria de ver isso em 3D e também experimentar opções como forças que diminuem com o inverso de r, o inverso do cubo de r ou r * log(r), ou partículas que “se repelem de longe e se atraem de muito perto”. Mesmo com otimizações inteligentes, tenho a sensação de que um sistema desses travaria
Fonte: https://github.com/ath92/particle-life
Esta versão processa tudo em shaders WebGL e armazena o estado da simulação em texturas e uniforms
Isso permite simular e desenhar mais partículas, mas usa extensões WebGL com suporte mais limitado, então pode não rodar em todos os dispositivos
Particle Life Emerges from Simplicity - https://news.ycombinator.com/item?id=34156592 - dezembro de 2022, 1 comentário
Particle Life Simulation - https://news.ycombinator.com/item?id=33680845 - novembro de 2022, 1 comentário
Particle Life - https://news.ycombinator.com/item?id=21875720 - dezembro de 2019, 7 comentários
Se tiver interesse, está aqui: https://github.com/jasonjmcghee/compute-shaders
Ou seja, no CGoL, as regras são aplicadas às posições da grade, não a objetos que se movem pela grade. Fico imaginando se este sistema também poderia ser construído de uma forma baseada em ondas
Além disso, neste sistema, a cada quadro todas as partículas interagem umas com as outras independentemente da distância, então a velocidade da luz parece infinita. Já no CGoL, cada célula só pode influenciar seus vizinhos imediatos a cada quadro, portanto existe uma espécie de velocidade da luz
Fico curioso se houve alguma ideia de adicionar suporte a shaders. Eu gostaria de ver uma versão mais lenta e “aglomerada” em tela cheia
Provavelmente transformaria meu Mac em um aquecedor, mas agora isso seria até uma vantagem ;)
https://www.youtube.com/watch?v=BpN-DE3o6u8
https://bingdev.binghamton.edu/sayama/SwarmChemistry/
Em especial, Lenia tem algumas variantes mais complexas; em relação a este tema, “Flow Lenia” e “Particle Lenia” me vêm à mente