Evoluindo um gerador de terreno

12

Recentemente, fiz essa pergunta e a conclusão parece ser que o uso de programação genética ( GP ) para criação de conteúdo de jogos para procedimentos não foi realmente feito. Eu quero mudar isso.

Estou bastante certo de que o GP pode ser implantado para ajudar a encontrar um novo gerador de terreno. A pergunta que estou chegando é como isso pode ser alcançado?

Todos os GPs têm algumas partes básicas que podem ser generalizadas para todos os GPs (seleção dos pais, recombinação, mutação, sobrevivência). Eu posso descobrir isso sozinho. O problema surge nas partes específicas do problema. É assim que você representa o problema no código (isso geralmente usa uma árvore) e como você avalia o quão bom um gerador pode ser (pode ser um ou mais valores).

As perguntas em poucas palavras:

  • Como você representaria um gerador de terreno de uma maneira que possa ser analisada em uma árvore?

  • Que tipo de terreno isso teria que gerar? (mapa de altura, gráfico de vértices, ...)

    Quanto menos isso for baseado em um hightmap, melhor.

  • O que seria usado para avaliar a adequação de uma solução?

    ex: queremos terrenos interessantes para que possamos ter um dos valores como a variação média nas normais de cada vértice no terreno.

Alex Shepard
fonte
1
Eu realmente sinto que você não quer GP por isso, mas GA. Os algoritmos para criar ruído, por exemplo, são realmente difíceis de gerar em tempo real e seria mais difícil criar uma função de condicionamento físico do que criar um sistema que a satisfaça. O GA é mais adequado para ajustar os parâmetros de um sistema existente.
DampeS8N 26/10/11
GP cria soluções interessantes que os humanos nunca pensam. É isso que estou procurando. O GP é difícil de usar, e provavelmente essa não seria a melhor maneira de usá-lo na indústria, mas mostraria alguma viabilidade importante se isso acontecer.
Alex Shepard

Respostas:

11

Você pode ter alguma sorte com uma abordagem semelhante às imagens genéticas de Karl Sims .

Ele usa um conjunto simples de operadores em uma linguagem semelhante ao LISP, de modo que a saída de qualquer operador possa ser utilizada para influenciar a imagem, da mesma forma que em alguns idiomas de sombreador (ou seja, um escalar seria um valor em escala de cinza, vector3seria RGB, etc.) )

Embora eu ache que isso seja coisa de implementação, o que você provavelmente quer são as palavras-chave, que (iirc) contêm todos os princípios básicos:

  • funções trigonométricas ( sin, cos, tanetc.)
  • position ( x, y)
  • operadores matemáticos básicos ( sqrt, pow, abs, inverse)
  • funções de ruído ( fBm, noise2, noise3)
  • outros fractais ( mandelbrot, julia)
  • funções de interpolação ( lerp, quad, step, smoothstep)

(Algumas das opções acima podem não estar em sua implementação; eu encontrei o trabalho dele há muito tempo e fiz algumas tentativas do que você está descrevendo ao longo dos anos - para que as memórias estejam vazando :)

Mantendo-o interessante (e rápido)

Tive um pouco de sorte com uma abordagem de várias camadas que reduziu enormemente a quantidade de evoluções mortas.

  1. um conjunto de intervalos é gerado para cada operador (ou alterado das rodadas anteriores)
    • idealmente, esses valores mantêm os valores dentro de um intervalo "saudável" para cada função, mas podem evoluir para intervalos com resultados surpreendentemente úteis, que parecem ser a coisa "certa" a ser feita.
  2. gerar algumas árvores de algoritmo
    • para cada um deles, crie alguns mapas de altura em posições aleatórias e avalie a adequação
    • se tivermos muitas correspondências boas, evolua um pouco nesse ramo, perturbando ligeiramente os intervalos da etapa 1 em cada filho
    • caso contrário, provavelmente temos intervalos ruins, volte para a etapa 1

Contudo...

Agora que eu pulei convenientemente o algoritmo de condicionamento físico , usei principalmente a abordagem de "seleção não natural" de Karl Sims, na qual você vê a geração atual no meio do quadrado de um monte de filhos (popularizado pelas Ferramentas de Potência de Kai na época - aqui está uma imagem do que eu quero dizer ) ..

No entanto, você provavelmente poderia ter um conjunto de imagens de treinamento, talvez algumas de imagens de satélite e outras artificiais com qualidades particulares, e talvez use a wavelet ou a análise 2D FFT nelas versus o terreno que você está testando?

Este é um tópico interessante, mas duvido que você precise de uma resposta :)

EDIT: ahh. tive que remover um monte de links porque eu sou um novo usuário: - |

pentaphobe
fonte
Isso parece levar à mesma coisa que eu estava entendendo, os algoritmos não se destinam à geração aleatória constante de conteúdo, mas ao treinar a geração em direção a um conjunto único ou limitado de resultados ... e ainda exige que um humano faça a seleção.
James
Pelo que posso imaginar, a aptidão teria que se basear em algumas análises estatísticas dos resultados. Os fatores que eu pude apresentar são a quantidade de variação dentro de um único terreno gerado em média sobre algum número de terrenos gerados (maximizado) e que valoriza o desvio padrão (minimizado, para estabilidade da variação). Mas acho que teríamos de maximizar também a mudança média de altura entre dois terrenos gerados.
Alex Shepard
1
@ Alex, talvez este artigo também seja interessante. Eu imagino que, se você virou alguma das técnicas mencionadas, poderia usá-las para orientar o condicionamento físico. (Ou poderia muito bem ser apenas o que você deseja :) #
5060
@phobius WOAH !! Legal. Preciso explorar um pouco mais, mas parece realmente promissor. Agora, para transformá-lo em um problema de pesquisa ...
Alex Shepard
2

Não tenho certeza de que você possa responder a essa pergunta, mas sinto uma explicação sobre por que pode ser uma resposta útil o suficiente. Então, Respostas em poucas palavras:

  • Você desejará escolher uma geração de terreno em que certos aspectos dela possam ser simplesmente baseados nos valores dos dados. Isso não é difícil de fazer, mas exige que você escolha uma geração de terreno. Como a área em que estou trabalhando é na geração de voxel, coisas como taxas de amostragem, passagens de encapsulamento, níveis de elevação etc. seriam coisas que podem ser colocadas em dados e 'evoluídas'.
  • Meio que anda de mãos dadas com a primeira parte. Não importa realmente com qual forma de geração você vai, desde que você possa definir diferentes propriedades dela. Essa escolha deve ter mais a ver com o tipo de jogo que você deseja fazer.
  • É aqui que ele se decompõe. Não consigo pensar em uma maneira de medir isso, além de uma Pessoa que realmente olha o mundo e diz "Oh, isso é legal". Mas isso remove o computador fazendo sua própria auto-iteração. Isso também implica que você usará essa forma de geração para criar um mundo único no final, procurando o 'melhor' ao invés de um aleatório todas as vezes.

Algoritmos genéticos são geralmente usados ​​para resolver um problema conhecido em que você pode definir o ambiente através de regras. Em seguida, você pode criar conjuntos de dados que representam propriedades diferentes que afetam como as coisas reagem às regras. O computador então executa uma 'rodada' com o conjunto de dados inicial, seleciona o número X superior, mistura seus valores após emparelhá-los e faz outra rodada. Um exemplo comum disso é 'criar um troll melhor' encontre um conjunto de valores em que o troll geralmente se sai muito bem em seu ambiente (é capaz de caçar e comer, matar ou ficar longe dos moradores, pode coletar itens e acumular todos os objetos brilhantes que deseja etc.).

Só não tenho certeza do que você está tentando realizar é aplicável no domínio da geração de terrenos. A única coisa que posso sugerir seria o tipo de avaliação do conteúdo do jogo em que você não queria planejar um mundo, mas queria fazer um em que o caminho da IA ​​pudesse ser calculado de maneira agradável ou algo assim. Mesmo com isso, você está procurando um único ou pelo menos limitado conjunto de mundos.

James
fonte
Ah ... acho que você está confundindo algoritmos evolutivos com programas genéticos. Os EAs são usados ​​para otimizar e ajustar entradas em um algoritmo. Os GPs são usados ​​para criar o próprio algoritmo e é isso que estou procurando. Boa resposta embora. Como nota: esses terrenos não precisam ser realistas, apenas interessantes.
Alex Shepard
Se você não conseguir definir "interessante" de maneira programática, terá o problema que estou tentando encontrar na resposta.
James
0

Que tipo de terreno isso teria que gerar? (mapa de altura, gráfico de vértices, ...)

Definitivamente um gráfico de vértice (uma malha), é compacto em termos de armazenamento e pode ser rasterizado (tesselated) sob demanda.

Como você representaria um gerador de terreno de uma maneira que possa ser analisada em uma árvore?

Autômatos celulares. Eu posso pensar em duas implementações:

  1. Autômatos definidos por regras, talvez com elementos de autômatos finitos (quando o estado atual, como tentativas de contador ou tempo ocioso, é levado em consideração).

    • Cada nó é inicializado com um estado aleatório
    • Cada nó tem uma instância do solucionador anexada
    • Cada solucionador continua calculando o próximo estado até ficar sem regras ou atingir seu estado ideal (eu terminei aqui)
    • Todos os próximos estados são calculados primeiro e depois aplicados de uma só vez antes do início dos próximos cálculos, para que a ordem de cálculo não seja importante

O próprio conjunto de regras pode ser representado como uma árvore de decisão de ramificação ou um simples lote de comandos (não tenho certeza se funcionará)

É apenas um conjunto de regras para cada nó

  1. Construtores do mundo. Em vez de aplicar um solucionador para cada nó, você pode criar apenas alguns deles e permitir que eles naveguem na malha.

    • Cada construtor possui seu próprio conjunto de regras
    • Impedir que eles entrem no nó ocupado por outro construtor
    • Cada construtor pode ser representado como um ramo da árvore
    • Durante a evolução, os construtores podem duplicar

Ainda assim, receio que a segunda abordagem precise ser apoiada pela primeira: a aleatoriedade inicial precisa ser suavizada e não tenho certeza se os construtores podem fazer o truque. Afinal, toda célula viva tem mitocôndrias.

O que seria usado para avaliar a adequação de uma solução?

A integridade do terreno resultante - não deve parecer um mish-mash. E a diversidade - geralmente queremos que o maior número possível de variações seja representado possível (o terreno plano de uma extremidade a outra não é divertido). Talvez algo mais complexo, como a forma como os nós vizinhos se encaixam (tundra no meio do deserto, o que?)

Tenho que experimentá-lo com meu gerador de malha quando / se tiver algum tempo livre =)

badunius
fonte