Ewolucja generatora terenu


12

Niedawno zadałem to pytanie i wydaje się, że wniosek jest taki, że wykorzystanie programowania genetycznego ( GP ) do tworzenia proceduralnych treści gier nie zostało tak naprawdę zrobione. Chcę to zmienić.

Jestem pewien, że GP może zostać wdrożony, aby pomóc znaleźć nowy generator terenu. Pytanie, które zadaję, brzmi: w jaki sposób można to osiągnąć?

Wszystkie GP mają kilka podstawowych części, które można uogólnić dla wszystkich GP (selekcja rodziców, rekombinacja, mutacja, przeżycie). Mogę je rozwiązać na własną rękę. Problem pojawia się w określonych częściach problemu. Oto jak reprezentujesz problem w kodzie (zwykle używa to drzewa) i jak oceniasz, jak dobry może być generator (może to być jedna lub więcej wartości).

Pytania w skrócie:

  • Jak przedstawilibyście generator terenu w sposób, który można sparsować do drzewa?

  • Jakiego rodzaju teren musiałby to wygenerować? (mapa wysokości, wykres wierzchołków, ...)

    Im mniej jest to oparte na mapie wysokości, tym lepiej.

  • Jaka byłaby wykorzystana do oceny przydatności rozwiązania?

    np .: chcemy interesującego terenu, aby jedną z wartości była średnia zmiana wartości normalnych dla każdego wierzchołka w terenie.


1
Naprawdę czuję, że nie chcesz za to GP, ale GA. Na przykład algorytmy generowania hałasu są naprawdę trudne do wygenerowania w locie i trudniej byłoby stworzyć funkcję fitness niż system, który ją spełnia. GA jest bardziej odpowiedni do poprawiania parametrów istniejącego systemu.
DampeS8N

GP tworzy ciekawe rozwiązania, o których ludzie tak naprawdę nigdy nie myślą. Tego właśnie szukam. GP jest trudna w użyciu i prawdopodobnie nie byłby to najlepszy sposób na zastosowanie tego w branży, ale okazałoby się, że okazałoby się, że jest to wykonalne.
Alex Shepard

Odpowiedzi:


11

Możesz mieć trochę szczęścia w podejściu podobnym do obrazów genetycznych Karla Simsa .

Używa prostego zestawu operatorów w języku podobnym do LISP, dzięki czemu dane wyjściowe dowolnego operatora mogą być wykorzystane do wpływania na obraz, podobnie jak w niektórych językach modułu cieniującego (tj. Skalar byłby wartością w skali szarości, vector3byłby RGBitd. ).

Chociaż myślę, że to są rzeczy związane z implementacją, więc prawdopodobnie potrzebujesz jego słów kluczowych, które (iirc) zawierają wszystkie podstawy:

  • funkcje wyzwalacza ( sin, cos, tanitp.)
  • pozycja ( x, y)
  • podstawowe operatory matematyczne ( sqrt, pow, abs, inverse)
  • funkcje hałasu ( fBm, noise2, noise3)
  • inne fraktale ( mandelbrot, julia)
  • funkcje interpolacji ( lerp, quad, step, smoothstep)

(Niektóre z powyższych mogą nie być w jego implementacji; znalazłem jego pracę dawno temu i faktycznie podjąłem kilka prób tego, co opisujesz przez lata - więc wspomnienia mogą przeciekać :)

Dzięki temu jest interesujący (i szybki)

Miałem trochę szczęścia dzięki wielowarstwowemu podejściu, które znacznie zmniejszyło liczbę martwych ewolucji.

  1. zestaw zakresów jest generowany dla każdego operatora (lub mutowany z poprzednich rund)
    • idealnie utrzymują wartości w „rozsądnym” zakresie dla każdej funkcji, ale mogą ewoluować w zakresy, które mają zaskakująco przydatne wyniki, co wydaje się być „właściwą” rzeczą do zrobienia
  2. wygeneruj kilka drzew algorytmów
    • dla każdego z nich wygeneruj kilka map wysokości w losowych pozycjach i oceń kondycję
    • jeśli mamy wiele dobrych dopasowań, to ewoluujemy nieco w dół tej gałęzi, zaburzając zakresy od kroku 1 u każdego dziecka
    • w przeciwnym razie prawdopodobnie mamy złe zakresy, wróć do kroku 1

Jednak...

Teraz wygodnie pominąłem algorytm fitness , najczęściej stosowałem podejście Karla Simsa do „nienaturalnej selekcji”, w której obecna generacja znajduje się na środkowym kwadracie grona potomków (spopularyzowanych przez Elektronarzędzia Kaia w ciągu dnia - oto obraz tego, co mam na myśli ) ..

Jednak prawdopodobnie mógłbyś mieć zestaw zdjęć treningowych, być może niektóre ze zdjęć satelitarnych i kilka sztucznych o szczególnych cechach, a następnie może użyć na nich analizy falkowej lub 2D FFT w stosunku do testowanego terenu?

To ciekawy temat, ale wątpię, na co potrzebowałeś odpowiedzi :)

EDYCJA: ahh. musiałem usunąć kilka linków, ponieważ jestem nowym użytkownikiem: - |


Wydaje się, że prowadzi to do tej samej rzeczy, do której dążyłem: algorytmy nie są przeznaczone do ciągłego losowego generowania treści, ale do szkolenia generacji w kierunku pojedynczego lub ograniczonego zestawu wyników ... i nadal wymaga od człowieka dokonania wyboru.
James

Z tego, co mogę wymyślić, sprawność musiałaby opierać się na analizie statystycznej wyników. Czynniki, które mogłem wymyślić, to ilość wariancji w obrębie jednego wygenerowanego terenu uśredniona dla pewnej liczby wygenerowanych terenów (maksymalna) i ta wartość odchylenia standardowego (zminimalizowana, dla stabilności wariancji). Ale wydaje mi się, że musielibyśmy zmaksymalizować średnią zmianę wysokości również między dowolnymi dwoma wygenerowanymi terenami.
Alex Shepard,

1
@Alex Być może ten artykuł również będzie interesujący. Wyobrażam sobie, że jeśli zwrócisz na głowę niektóre ze wspomnianych technik, możesz użyć ich do poprowadzenia ćwiczeń. (Lub może to być po prostu to, czego chcesz :)
pentaphobe

@phobius WOAH !! Chłodny. Muszę to jeszcze zbadać, ale wygląda naprawdę obiecująco. Teraz, aby zmienić go w problem wyszukiwania ...
Alex Shepard

2

Nie jestem pewien, czy potrafisz odpowiedzieć na to pytanie, ale wyjaśniam, dlaczego odpowiedź może być wystarczająco pomocna. Tak więc odpowiedzi w skrócie:

  • Będziesz chciał wybrać generację terenu, w której pewne aspekty mogą być oparte na wartościach danych. Nie jest to trudne, ale wymaga wybrania generacji terenu. Ponieważ obszar, w którym pracuję, to generowanie wokseli, rzeczy takie jak częstotliwości próbkowania, przejścia tunelowe, poziomy wysokości itp. Byłyby rzeczami, które można umieścić w danych i „ewoluować”.
  • Niby idzie w parze z pierwszą częścią. Tak naprawdę nie ma znaczenia, z jaką formą wybierasz, o ile możesz ustawić różne jej właściwości. Ten wybór powinien mieć więcej wspólnego z rodzajem gry, którą chcesz stworzyć.
  • Tu się psuje. Nie mogę wymyślić sposobu, by to zmierzyć poza Osobą, która faktycznie patrzy na świat i mówi „Och, to miło”. Ale to usuwa komputer wykonujący własną iterację. Oznacza to również, że zamierzasz użyć tej formy generacji do stworzenia jednego świata w końcu, szukając „najlepszego”, a nie losowego za każdym razem.

Algorytmy genetyczne są zwykle używane do rozwiązania znanego problemu, w którym można zdefiniować środowisko za pomocą reguł. Następnie możesz utworzyć zestawy danych reprezentujące różne właściwości, które wpływają na to, jak rzeczy reagują na reguły. Następnie komputer rozgrywa „rundę” z początkowym zestawem danych, wybiera górny numer X, miesza ich wartości po sparowaniu ich ze sobą i wykonuje kolejną rundę. Typowym przykładem tego jest „hodowanie lepszego trolla” (robienie znajdź zestaw wartości, w których troll ogólnie radzi sobie bardzo dobrze w swoim otoczeniu (jest w stanie polować i jeść, zabijać lub trzymać się z dala od mieszkańców wioski, może zbierać łupy i gromadzić wszystkie lśniące przedmioty, których pragnie itp.).

Po prostu nie jestem pewien, czy to, co próbujesz osiągnąć, ma zastosowanie w dziedzinie generowania terenu. Jedyne, co mogę wymyślić, to oceny zawartości gry, w których nie chciałeś planować świata, ale chciałeś stworzyć taki, w którym ścieżki AI można obliczyć ładnie lub coś w tym rodzaju. Mimo to szukasz jednego lub co najmniej ograniczonego zestawu światów.


Ach ... Myślę, że mylisz algorytmy ewolucyjne z programami genetycznymi. EA służą do optymalizacji i poprawiania danych wejściowych algorytmu. Lekarze GP są wykorzystywani do budowy samego algorytmu i właśnie tego szukam. Dobra odpowiedź. Uwaga: tereny te nie muszą być realistyczne, tylko interesujące.
Alex Shepard

Jeśli nie możesz zdefiniować „interesujący” w sposób programowy, to będziesz miał problem, na który próbuję się znaleźć w odpowiedzi.
James

0

Jakiego rodzaju teren musiałby to wygenerować? (mapa wysokości, wykres wierzchołków, ...)

Zdecydowanie wykres wierzchołkowy (siatka), jest kompaktowy pod względem pamięci i może być rasteryzowany (mozaikowy) na żądanie.

Jak przedstawilibyście generator terenu w sposób, który można sparsować do drzewa?

Automaty komórkowe. Mogę wymyślić dwie implementacje:

  1. Automaty z zestawami reguł, być może z elementami automatów skończonych (gdy brany jest pod uwagę stan obecny, np. Licznik prób lub czas bezczynności).

    • Każdy węzeł jest inicjowany stanem losowym
    • Każdy węzeł ma dołączoną instancję solvera
    • Każdy solver oblicza następny stan, dopóki nie skończy mu się reguła lub nie osiągnie stanu idealnego (skończyłem tutaj)
    • Wszystkie następne stany są obliczane najpierw, a następnie stosowane jednocześnie, przed rozpoczęciem kolejnych obliczeń, więc kolejność obliczeń nie będzie miała znaczenia

Sam zestaw reguł może być reprezentowany jako rozgałęzione drzewo decyzyjne lub prosta partia poleceń (nie jestem pewien, czy zadziała)

To tylko jeden zestaw reguł dla każdego węzła

  1. Światowi budowniczowie. Zamiast stosować solver dla każdego węzła, możesz utworzyć tylko kilka z nich i pozwolić im poruszać się po siatce.

    • Każdy konstruktor ma własny zestaw reguł
    • Nie pozwól im wejść do węzła zajmowanego przez innego konstruktora
    • Każdy konstruktor może być reprezentowany jako gałąź drzewa
    • Podczas ewolucji budowniczowie mogą się powielać

Mimo to obawiam się, że drugie podejście musi być poparte pierwszym: początkowa losowość musi zostać wygładzona i nie jestem pewien, czy budowniczowie poradzą sobie z tym. W końcu każda żywa komórka ma mitochondria.

Jaka byłaby wykorzystana do oceny przydatności rozwiązania?

Integralność powstałego terenu - nie powinno to wyglądać jak miszmasz. I różnorodność - generalnie chcemy, aby jak najwięcej dostępnych wariantów było reprezentowanych (płaskie pustkowie z jednej krawędzi na drugą nie jest zabawne). Może coś bardziej złożonego, jak na przykład sąsiednie węzły (tundra na środku pustyni, co?)

Muszę spróbować sam z moim generatorem siatki, kiedy / jeśli mam trochę wolnego czasu =)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.