Evoluzione di un generatore di terreno


12

Di recente ho posto questa domanda e la conclusione sembra essere che l'uso della programmazione genetica ( GP ) per la creazione di contenuti di giochi procedurali non sia stato realmente fatto. Voglio cambiarlo.

Sono abbastanza certo che GP potrebbe essere schierato per aiutare a trovare un nuovo generatore di terreno. La domanda a cui mi sto rivolgendo è come si potrebbe ottenere questo risultato?

Tutti i medici generici hanno alcune parti di base che possono essere generalizzate per tutti i medici generici (selezione dei genitori, ricombinazione, mutazione, sopravvivenza). Posso capirli da solo. Il problema sorge nelle parti specifiche del problema. Ecco come si rappresenta il problema nel codice (di solito utilizza un albero) e come si valuta quanto potrebbe essere buono un generatore (questo può essere uno o più valori).

Le domande in breve:

  • Come rappresenteresti un generatore di terreno in un modo che può essere analizzato in un albero?

  • Che tipo di terreno dovrebbe generare? (heightmap, grafico del vertice, ...)

    Meno si basa su una mappa hight, meglio è.

  • Cosa verrebbe utilizzato per valutare l'idoneità di una soluzione?

    es: vogliamo un terreno interessante in modo da poter avere uno dei valori come la variazione media delle normali per ogni vertice sul terreno.


1
Sento davvero che non vuoi GP per questo, ma GA. Gli algoritmi per la creazione di rumore, ad esempio, sono davvero difficili da generare al volo e sarebbe più difficile creare una funzione di fitness piuttosto che creare un sistema che lo soddisfi. GA è più adatto a modificare i parametri di un sistema esistente.
DampeS8N,

GP crea soluzioni interessanti a cui gli umani non pensano mai. Questo è quello che sto cercando. Il GP è difficile da usare, e probabilmente questo non sarebbe il modo migliore per usarlo nel settore, ma mostrerebbe una fattibilità maggiore se risultasse.
Alex Shepard,

Risposte:


11

Potresti avere un po 'di fortuna con un approccio simile alle immagini genetiche di Karl Sims .

Usa un semplice set di operatori in un linguaggio simile a LISP in modo tale che l'output di qualsiasi operatore possa essere utilizzato per influenzare l'immagine, in modo simile ad alcuni linguaggi shader (cioè uno scalare sarebbe un valore in scala di grigi, un vector3sarebbe RGB, ecc. ).

Anche se immagino che sia roba di implementazione, quindi quello che probabilmente vuoi sono le sue parole chiave, che (iirc) contengono tutte le basi:

  • funzioni di trigger ( sin, cos, tan, ecc.)
  • posizione ( x, y)
  • operatori matematici di base ( sqrt, pow, abs, inverse)
  • funzioni noise ( fBm, noise2, noise3)
  • altri frattali ( mandelbrot, julia)
  • funzioni di interpolazione ( lerp, quad, step, smoothstep)

(Alcuni dei precedenti potrebbero non essere nella sua implementazione; ho trovato il suo lavoro molto tempo fa e in realtà ho fatto alcuni tentativi di ciò che descrivi nel corso degli anni - quindi i ricordi potrebbero perdere :)

Mantenerlo interessante (e veloce)

Ho avuto un po 'di fortuna con un approccio a più livelli che ha ridotto enormemente la quantità di evoluzioni morte.

  1. viene generato un set di intervalli per ciascun operatore (o mutato dai round precedenti)
    • questi mantengono idealmente i valori all'interno di un intervallo "sano" per ogni funzione, ma possono evolversi in intervalli che hanno risultati sorprendentemente utili, che sembra la cosa "giusta" da fare
  2. generare alcuni alberi di algoritmi
    • per ognuno di questi genera alcune mappe di altezza in posizioni casuali e valuta l'idoneità
    • se abbiamo molte buone corrispondenze allora evolviamo un po 'lungo questo ramo, perturbando leggermente gli intervalli dal passaggio 1 in ogni bambino
    • in caso contrario, abbiamo probabilmente intervalli errati, tornare al passaggio 1

Tuttavia...

Ora ho saltato convenientemente l' algoritmo di fitness , ho usato principalmente l'approccio di "selezione innaturale" di Karl Sims in cui vedi l'attuale generazione nel quadrato centrale di un gruppo di prole (reso popolare dai Power Tools di Kai nel corso della giornata - ecco l' immagine di quello che voglio dire ) ..

Tuttavia potresti probabilmente avere una serie di immagini di allenamento, forse alcune da immagini satellitari e alcune artificiali con qualità particolari e quindi forse usare l'analisi wavelet o 2D FFT su di esse rispetto al terreno che stai testando?

Questo è un argomento interessante, ma dubito di cosa tu abbia bisogno di una risposta :)

EDIT: ahh. ho dovuto rimuovere un sacco di link perché sono un nuovo utente Sorry |


Questo sembra portare alla stessa cosa a cui stavo arrivando, gli algoritmi non sono pensati per una costante generazione casuale di contenuti, ma per addestrare la generazione verso un singolo o limitato insieme di risultati ... e richiede ancora un essere umano per effettuare la selezione.
James,

Da quello che posso immaginare la forma fisica dovrebbe essere basata su alcune analisi statistiche dei risultati. I fattori che ho potuto trovare sono la quantità di varianza all'interno di un singolo terreno generato mediata su un certo numero di terreni generati (massimizzato) e che valorizza la deviazione standard (minimizzata, per la stabilità della varianza). Ma poi suppongo che dovremmo massimizzare anche il cambiamento medio delle altezze tra due terreni generati.
Alex Shepard,

1
@Alex forse anche questo documento sarà di interesse. Immagino che se hai messo in testa alcune delle tecniche menzionate, potresti usarle per guidare il fitness. (O potrebbe benissimo essere proprio quello che vuoi :)
pentaphobe,

@phobius WOAH !! Freddo. Devo esplorarlo ancora, ma sembra davvero promettente. Ora per trasformarlo in un problema di ricerca ...
Alex Shepard

2

Non sono sicuro che puoi rispondere a questa domanda, ma sento una spiegazione sul perché potrebbe essere una risposta abbastanza utile. Quindi, le risposte in breve:

  • Dovrai scegliere una generazione del terreno in cui alcuni aspetti di essa possano essere semplicemente basati su valori di dati. Questo non è difficile da fare, ma richiede di scegliere una generazione del terreno. Poiché l'area in cui sto lavorando è la generazione di voxel, cose come velocità di campionamento, passaggi di tunneling, livelli di elevazione ecc. Sarebbero cose che possono essere inserite nei dati e "evolute".
  • Un po 'va di pari passo con la prima parte. Non importa in quale forma di generazione segui finché puoi impostarne diverse proprietà. Questa scelta dovrebbe avere più a che fare con il tipo di gioco che stai cercando di fare.
  • Questo è dove si rompe. Non riesco a pensare a un modo per misurarlo a parte una persona che guarda davvero il mondo e dice "Oh, che bello". Ma questo rimuove il computer facendo la propria autoiterazione. Ciò implica anche che userete questa forma di generazione per creare un mondo unico alla fine, alla ricerca del "migliore" invece di uno casuale ogni volta.

Gli algoritmi genetici vengono generalmente utilizzati per risolvere un problema noto in cui è possibile definire l'ambiente tramite regole. Quindi è possibile creare set di dati che rappresentano proprietà diverse che influiscono sul modo in cui le cose reagiscono alle regole. Il computer quindi gioca un "round" con il set di dati iniziale, seleziona il numero X in alto, mescola i loro valori dopo averli accoppiati e fa un altro round. Un esempio comune di questo è "allevare un troll migliore" (facendo l'allevamento a trova un insieme di valori in cui il troll generalmente si comporta molto bene nel suo ambiente (è in grado di cacciare e mangiare, uccidere o stare lontano dagli abitanti del villaggio, può raccogliere bottini e accumulare tutti gli oggetti luccicanti che desidera, ecc.).

Non sono sicuro che ciò che stai cercando di realizzare sia applicabile nel regno della generazione del terreno. L'unica cosa che posso escogitare sarebbe una sorta di valutazione dei contenuti di gioco in cui non volevi pianificare un mondo ma volevi crearne uno in cui calcolare il percorso dell'IA o qualcosa del genere. Anche con questo, tuttavia, stai cercando un singolo o almeno un insieme limitato di mondi.


Ah ... penso che tu stia confondendo gli algoritmi evolutivi con i programmi genetici. Gli EA vengono utilizzati per ottimizzare e ottimizzare gli input di un algoritmo. I GP sono usati per costruire l'algoritmo stesso ed è quello che sto cercando. Buona risposta però. Come nota: questi terreni non devono essere realistici, ma solo interessanti.
Alex Shepard,

Se non riesci a definire "interessante" in modo programmatico, allora avrai il problema che sto cercando di ottenere nella risposta.
James,

0

Che tipo di terreno dovrebbe generare? (heightmap, grafico del vertice, ...)

Sicuramente un grafico vertice (una mesh), è compatto dal punto di vista dello storage e può essere rasterizzato (tassellato) su richiesta.

Come rappresenteresti un generatore di terreno in un modo che può essere analizzato in un albero?

Automi cellulari. Mi vengono in mente due implementazioni:

  1. Automi con regole, forse con elementi di automi finiti (quando viene preso in considerazione lo stato corrente, come i tentativi di contatore o tempo di inattività).

    • Ogni nodo è inizializzato con uno stato casuale
    • Ogni nodo ha un'istanza di solutore collegata
    • Ogni risolutore continua a calcolare il prossimo stato fino a quando non si esauriscono le regole o raggiunge il suo stato ideale (ho finito qui)
    • Tutti gli stati successivi vengono calcolati per primi e quindi applicati tutti in una volta prima dell'inizio dei calcoli successivi, quindi l'ordine di calcolo non avrà importanza

Il set di regole stesso può essere rappresentato come un albero decisionale ramificato o un semplice batch di comandi (non sono sicuro che funzionerà)

È solo una serie di regole per ogni nodo

  1. World-costruttori. Invece di applicare un solutore per ogni singolo nodo, puoi crearne solo un gruppo e consentire loro di navigare nella mesh.

    • Ogni costruttore ha il proprio set di regole
    • Impedisci loro di entrare nel nodo occupato da un altro builder
    • Ogni costruttore può essere rappresentato come un ramo dell'albero
    • Durante l'evoluzione i costruttori possono duplicare

Tuttavia, temo che il secondo approccio debba essere supportato dal primo: la casualità iniziale deve essere attenuata e non sono sicuro che i costruttori possano fare il trucco. Dopo tutto, ogni cellula vivente ha mitocondri.

Cosa verrebbe utilizzato per valutare l'idoneità di una soluzione?

L'integrità del terreno risultante - non dovrebbe apparire come un miscuglio. E la diversità - generalmente vogliamo che vengano rappresentate quante più variazioni disponibili (la terra desolata piatta da un bordo all'altro non è divertente). Forse qualcosa di più complesso come l'adattamento dei nodi vicini (tundra in mezzo al deserto, cosa?)

Devo provarlo per me stesso con il mio generatore di mesh quando / se ho del tempo libero =)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.