Faire évoluer un générateur de terrain

12

J'ai récemment posé cette question et la conclusion semble être que l'utilisation de la programmation génétique ( GP ) pour la création de contenu de jeu procédural n'a pas vraiment été faite. Je veux changer cela.

Je suis assez certain que le GP pourrait être déployé pour aider à trouver un nouveau générateur de terrain. La question que je me pose est de savoir comment cela pourrait être réalisé?

Tous les médecins généralistes ont quelques éléments de base qui peuvent être généralisés pour tous les médecins généralistes (sélection des parents, recombinaison, mutation, survie). Je peux les comprendre par moi-même. Le problème se pose dans les parties spécifiques du problème. Voici comment vous représentez le problème dans le code (cela utilise généralement un arbre) et comment vous évaluez la qualité d'un générateur (cela peut être une ou plusieurs valeurs).

Les questions en bref:

  • Comment représenteriez-vous un générateur de terrain d'une manière qui peut être analysée dans un arbre?

  • Quel type de terrain cela devrait-il générer? (carte des hauteurs, graphe des sommets, ...)

    Moins cela est basé sur une carte verticale, mieux c'est.

  • Que serait utilisé pour évaluer l'aptitude d'une solution?

    ex: nous voulons un terrain intéressant afin que nous puissions avoir l'une des valeurs comme la variation moyenne des normales pour chaque sommet du terrain.

Alex Shepard
la source
1
Je sens vraiment que vous ne voulez pas de GP pour ça, mais GA. Les algorithmes pour créer du bruit, par exemple, sont vraiment difficiles à générer à la volée et il serait plus difficile de créer une fonction de fitness que de créer un système qui le satisfasse. GA est plus approprié pour peaufiner les paramètres d'un système existant.
DampeS8N
GP propose des solutions intéressantes auxquelles les humains ne pensent jamais vraiment. C'est ce que je recherche. Le GP est difficile à utiliser, et ce ne serait probablement pas la meilleure façon d'utiliser cela dans l'industrie, mais cela se révélerait très faisable s'il s'avérait.
Alex Shepard

Réponses:

11

Vous aurez peut-être de la chance avec une approche similaire aux images génétiques de Karl Sims .

Il utilise un simple ensemble d'opérateurs dans un langage de type LISP de sorte que la sortie de n'importe quel opérateur puisse être utilisée pour influencer l'image, de la même manière que dans certains langages de shader (c'est-à-dire qu'un scalaire serait une valeur d'échelle de gris, un vector3serait RGB, etc.). ).

Bien que je suppose que ce sont des éléments d'implémentation, ce que vous voulez probablement, ce sont ses mots-clés, qui (iirc) contiennent toutes les bases:

  • fonctions trig ( sin, cos, tan, etc.)
  • position ( x, y)
  • opérateurs mathématiques de base ( sqrt, pow, abs, inverse)
  • fonctions de bruit ( fBm, noise2, noise3)
  • autres fractales ( mandelbrot, julia)
  • fonctions d'interpolation ( lerp, quad, step, smoothstep)

(Certains des éléments ci-dessus peuvent ne pas être dans son implémentation; j'ai trouvé son travail il y a longtemps et j'ai en fait fait quelques tentatives dans ce que vous décrivez au fil des ans - donc les souvenirs peuvent fuir :)

Le garder intéressant (et rapide)

J'ai eu un peu de chance avec une approche multicouche qui a massivement réduit le nombre d'évolutions mortes.

  1. un ensemble de plages est généré pour chaque opérateur (ou muté à partir des tours précédents)
    • ceux-ci gardent idéalement les valeurs dans une plage «saine» pour chaque fonction, mais peuvent évoluer en plages qui ont des résultats étonnamment utiles, ce qui semble être la «bonne» chose à faire
  2. générer quelques arbres d'algorithmes
    • pour chacun d'eux, générer quelques plans d'altitude à des positions aléatoires et évaluer la forme physique
    • si nous avons beaucoup de bonnes correspondances, évoluez un peu dans cette branche, perturbant légèrement les plages de l' étape 1 chez chaque enfant
    • sinon, nous avons probablement de mauvaises plages, revenez à l' étape 1

Pourtant...

Maintenant que j'ai commodément sauté l' algorithme de fitness , j'ai surtout utilisé l'approche de Karl Sims de la "sélection non naturelle" où vous voyez la génération actuelle au milieu d'un tas de progénitures (popularisé par les outils électriques de Kai à l'époque - voici une image de ce que je veux dire ) ..

Cependant, vous pourriez probablement avoir un ensemble d'images d'entraînement, peut-être des images satellite et quelques images artificielles avec des qualités particulières, puis utiliser une analyse en ondelettes ou FFT 2D par rapport au terrain que vous testez?

C'est un sujet intéressant, mais je doute que vous ayez besoin d'une réponse :)

EDIT: ahh. a dû supprimer un tas de liens parce que je suis un nouvel utilisateur: - |

pentaphobe
la source
Cela semble conduire à la même chose que je voulais dire, les algorithmes ne sont pas destinés à une génération aléatoire constante de contenu mais à la formation de la génération vers un ensemble unique ou limité de résultats ... et nécessitent toujours un humain pour faire la sélection.
James
D'après ce que je peux comprendre, la forme physique devrait être basée sur une analyse statistique des résultats. Les facteurs que j'ai pu trouver sont la quantité de variance à l'intérieur d'un terrain généré unique en moyenne sur un certain nombre de terrains générés (maximisée) et qui valorise l'écart type (minimisé, pour la stabilité de la variance). Mais je suppose que nous devrions également maximiser la variation moyenne des hauteurs entre deux terrains générés.
Alex Shepard,
1
@Alex peut - être que ce document sera également intéressant. J'imagine que si vous renversiez une partie de la technique mentionnée, vous pourriez l'utiliser pour guider la forme physique. (Ou cela pourrait bien être ce que vous voulez :)
pentaphobe
@phobius WOAH !! Cool. Je dois l'explorer un peu plus, mais cela semble vraiment prometteur. Maintenant, pour en faire un problème de recherche ...
Alex Shepard
2

Je ne suis pas sûr que vous puissiez répondre à cette question, mais je pense qu'une explication de la raison pourrait être une réponse suffisamment utile. Donc, les réponses en bref:

  • Vous souhaiterez choisir une génération de terrain où certains aspects de celle-ci peuvent simplement être basés sur des valeurs de données. Ce n'est pas difficile à faire, mais vous oblige à choisir une génération de terrain. Étant donné que la zone dans laquelle je travaille est dans la génération de voxels, des choses comme les taux d'échantillonnage, les passes de tunneling, les niveaux d'élévation, etc. seraient des choses qui peuvent être mises en données et évoluées.
  • Cela va de pair avec la première partie. Peu importe la forme de génération avec laquelle vous allez tant que vous pouvez en définir différentes propriétés. Ce choix devrait avoir plus à voir avec le type de jeu que vous cherchez à faire.
  • C'est là que ça tombe en panne. Je ne peux pas penser à un moyen de mesurer cela en dehors d'une personne qui regarde réellement le monde et qui dit "Oh c'est bien". Mais cela supprime l'ordinateur faisant sa propre auto-itération. Cela implique également que vous allez utiliser cette forme de génération pour créer un monde unique à la fin, en recherchant le «meilleur» par opposition à un aléatoire à chaque fois.

Les algorithmes génétiques sont généralement utilisés pour résoudre un problème connu où vous pouvez définir l'environnement via des règles. Ensuite, vous pouvez créer des ensembles de données qui représentent différentes propriétés qui affectent la façon dont les choses réagissent aux règles. L'ordinateur joue ensuite un «tour» avec l'ensemble de données initial, sélectionne le numéro X supérieur, mélange leurs valeurs après les avoir appariés et fait un autre tour. Un exemple courant de ceci est «l'élevage d'un meilleur troll» (faire l'élevage pour trouver un ensemble de valeurs où le troll fait généralement très bien dans son environnement (est capable de chasser et de manger, de tuer ou de rester à l'écart des villageois, peut collecter du butin et amasser tous les objets brillants qu'il désire, etc.).

Je ne suis tout simplement pas sûr que ce que vous essayez d'accomplir soit applicable dans le domaine de la génération de terrain. La seule chose que je peux trouver serait des sortes d'évaluations de contenu de jeu où vous ne vouliez pas planifier un monde mais vouliez en faire un dans lequel le cheminement de l'IA peut être calculé correctement ou quelque chose comme ça. Même avec cela, cependant, vous recherchez un univers unique ou au moins limité.

James
la source
Ah ... Je pense que vous confondez les algorithmes évolutionnaires avec les programmes génétiques. Les EA sont utilisés pour optimiser et modifier les entrées d'un algorithme. Les GPs sont utilisés pour construire l'algorithme lui-même et c'est ce que je recherche. Bonne réponse cependant. Remarque: ces terrains n'ont pas besoin d'être réalistes, ils sont juste intéressants.
Alex Shepard
Si vous ne pouvez pas définir «intéressant» de manière programmatique, alors vous allez avoir le problème que j'essaie de résoudre dans la réponse.
James
0

Quel type de terrain cela devrait-il générer? (carte des hauteurs, graphe des sommets, ...)

Certainement un graphique de sommet (un maillage), il est compact en termes de stockage et peut être tramé (tesselé) à la demande.

Comment représenteriez-vous un générateur de terrain d'une manière qui peut être analysée dans un arbre?

Automates cellulaires. Je peux penser à deux implémentations:

  1. Automates à jeu de règles, peut-être avec des éléments d'automates finis (lorsque l'état actuel, comme le compteur de tentatives ou le temps d'inactivité, est pris en compte).

    • Chaque nœud est initialisé avec un état aléatoire
    • Chaque nœud a une instance de solveur attachée
    • Chaque solveur continue de calculer l'état suivant jusqu'à ce qu'il manque de règles ou atteigne son état idéal (j'ai terminé ici)
    • Tous les états suivants sont calculés en premier puis appliqués en une seule fois avant le début des prochains calculs, donc l'ordre de calcul n'aura pas d'importance

L'ensemble de règles lui-même peut être représenté comme un arbre de décision de branchement ou un simple lot de commandes (je ne sais pas si cela fonctionnera)

Ce n'est qu'un ensemble de règles pour chaque nœud

  1. Constructeurs du monde. Au lieu d'appliquer un solveur pour chaque nœud, vous pouvez en créer juste un groupe et leur permettre de naviguer dans le maillage.

    • Chaque constructeur a son propre ensemble de règles
    • Les empêcher d'entrer dans le nœud occupé par un autre constructeur
    • Chaque constructeur peut être représenté comme une branche de l'arbre
    • Au cours de l'évolution, les constructeurs peuvent dupliquer

Pourtant, j'ai peur que la deuxième approche doive être soutenue par la première: le caractère aléatoire initial doit être lissé et je ne sais pas si les constructeurs peuvent faire l'affaire. Après tout, chaque cellule vivante a des mitochondries.

Que serait utilisé pour évaluer l'aptitude d'une solution?

L'intégrité du terrain résultant - il ne devrait pas ressembler à un méli-mélo. Et la diversité - en général, nous voulons que le plus grand nombre possible de variantes disponibles soient représentées (la friche plate d'un bord à l'autre n'est pas drôle). Peut-être quelque chose de plus complexe comme la façon dont les nœuds voisins s'emboîtent (toundra au milieu du désert, quoi?)

Je dois l'essayer par moi-même avec mon générateur de maillage quand / si j'ai du temps libre =)

badunius
la source