Sprawienie, by sztuczna inteligencja podążała do siebie różnymi ścieżkami


16

Mam odgórną grę 2D, w której AI odradza się na krawędziach mapy i biegnę w kierunku centrum.

Używam A * i siatki węzłów do wyszukiwania ścieżek.

W tej chwili AI odradza się w punkcie na brzegu mapy i wszyscy podążają tą samą ścieżką, która jest najkrótszą drogą do centrum.

Teraz chcę, żeby były bardziej zaskakujące i interesujące i podążały różnymi ścieżkami.

Mogę od razu pomyśleć o dwóch pomysłach na zrobienie tego, ale chciałem wiedzieć, czy istnieją inne sposoby lub lepsze sposoby, z których ludzie często korzystają?

  1. Gdy jeden wróg odrodzi się i wygeneruje ścieżkę do centrum, tymczasowo zwiększ koszty wszystkich węzłów na tej ścieżce, a następnie powoli zmniejszaj je z czasem. Wtedy wroga AI, która pojawi się później, będzie zmuszona obrać szerszą ścieżkę.

  2. Powyższe podejście doprowadzi do tego, że sztuczna inteligencja pójdzie coraz szerszą ścieżką i nadal będzie bardzo przewidywalna. Pomyślałem więc, że wprowadzę również kilka pośrednich węzłów bramkowych na mapie. Kiedy AI odrodzi się, losowo wybierają jeden z pośrednich celów i kierują się tam najpierw, zanim udadzą się na środek mapy. Łącząc to z powyższym podejściem zwiększania kosztów może wyglądać całkiem dobrze?

Jakie podejścia ludzie uważają za najlepsze, aby sztuczna inteligencja zmieniała ścieżki, którymi podążają, wyglądała przekonująco i zaskakująco?

Odpowiedzi:


7

Druga opcja sugeruje bardziej podstawowe podejście: zapewnienie wrogom zbliżania się do gracza z różnych kierunków. Pytanie brzmi: jak daleko muszą się udać, aby ominąć gracza? Ideałem do tego byłoby połączenie

  • dynamicznie generujące punkty, które ściśle otaczają (tj. podążają) pozycję gracza;
  • co zasugerował Nevermind w zakresie randomizacji ścieżek do tych otaczających punktów, w większym lub mniejszym stopniu.

W ten sposób możesz zagwarantować, że AI nie podejmą niepotrzebnie długich objazdów, aby uzyskać realistyczną zmienność ścieżki podczas zbliżania się do gracza.

Wspólna dyfuzja robi to, co chcesz pośrednio, jako część algorytmu. Ale wdrożenie nie jest łatwe.


Wspólna dyfuzja jest tylko wypełnieniem powodziowym z pewną wagą. Jest banalny do wdrożenia, może łatwiejszy niż A *. Wymaga tylko innego spojrzenia na twój świat - być może nietrywialnej zmiany konceptualnej, ale nie ma problemu z implementacją.

Wciąż nie jest to łatwe do wdrożenia, ponieważ jest niestandardowym punktem widzenia w zakresie zarządzania jednostkami AI :)
Inżynier

Dzięki Nick. Myślę, że głównym sposobem będzie ustanowienie niektórych punktów nawigacyjnych otaczających gracza na środku mapy. Nie jestem pewien na tym etapie, czy będą generowane dynamicznie, czy jakieś ręczne tworzenie dla każdego poziomu w mojej konkretnej sytuacji. Dzięki jeszcze raz!
TerryB,

12

Pierwszym pomysłem jest dodanie małej losowej wartości do masy każdego węzła podczas wyszukiwania ścieżki. W ten sposób każdy agent będzie szukał ścieżki w nieco innym środowisku. Nie jestem pewien, czy to zadziała w twoim przypadku, ale powinno być naprawdę łatwe do wypróbowania.


Wrogowie skończą biegać jak kurczaki, a w drobnoziarnistym otoczeniu ścieżki nie będą tak różne. Jest dobrym dodatkiem do innych rozwiązań, ale nie jest rozwiązaniem samym w sobie
Coyote

@Coyote Zależy to w dużej mierze od struktury siatki i relacji między wagami węzłów, prędkościami i składową losową. Dlatego sformułowałem odpowiedź jako sugestię, a nie jako jednoznaczną odpowiedź.
Nevermind

Rzeczywiście :) Zazwyczaj jestem fanem entropii. Ale efekt końcowy rzadko jest świetny.
Coyote

Właściwie uważam, że odpowiedź Nicka Wiggilla jest znacznie lepsza niż moja. Ale jakoś nie zyskuje przychylności, na jaką zasługuje.
Nevermind,

To jest ... Ale twój jest pierwszy i prostszy ... moglibyśmy spróbować go zagłosować: P
Coyote

3

Podoba mi się odpowiedź Neverminda , jednak biorąc pod uwagę ograniczenia opisane w komentarzach, chciałbym spróbować:

  1. Algorytm dla pojedynczej jednostki do środka rejestruje całkowitą przebytą odległość.
  2. Dla każdej kolejnej jednostki przydziel jej odległość, która jest losowa i niewielka ilość dłuższa niż ta.
  3. Wykonując A * dla każdej jednostki, dodaj dodatkową wagę w zależności od tego, jak blisko jesteś i jak daleko chcesz „podróżować”. To prawdopodobnie byłoby coś takiego (distanceToGoal) + Max(0, desiredDistance - distanceTravelled)).

Spowodowałoby to, że jednostki spróbowałyby pójść dalej, co prawdopodobnie jest inną ścieżką, co skutkowałoby tym, że mogłyby pójść różnymi ścieżkami.

Możesz także dodać go do początkowej wartości dla każdej jednostki, ale losowy zasięg prawdopodobnie musiałby być nieco większy.


2

Jak wskazał Nick Wiggill, najprostszym podejściem byłoby uzyskanie okręgu otaczającego cel.

  • losowo przypisz punkt w pobliżu tego okręgu jako punkt orientacyjny.
  • wyeliminuj wszystkie ścieżki w okręgu z początkowej ścieżki (lub znacznie zwiększ wartość tych punktów)
  • następnie z tego punktu wyznacz ścieżkę do celu.

Ważną częścią jest wyeliminowanie wszystkich ścieżek w kręgu dla oryginalnego punktu, ponieważ prawdopodobnie trafilibyście do wrogów przechodzących przez koło, aby dostać się do ich początkowego punktu.

Z tego można uzyskać dowolny wariant, grając z wieloma wartościami, dodając dodatkowe punkty na okręgu w pobliżu początkowego itd.


jeśli twoja mapa to obsługuje, znajdź „interesujące” lokalizacje wokół tego kręgu (drzwi, osłona, drzewa, skały, budynki; dowolny węzeł z pewną przewagą taktyczną) i poproś wrogów o wybranie tych miejsc, jeśli są dostępne i pojawią się tylko w otwarte, jeśli muszą. Będzie to wyglądać znacznie mądrzej niż po prostu uderzenie w losowe miejsce na krawędzi koła.
DampeS8N

Dzięki Coyote, tak, prawdopodobnie wybiorę rozwiązanie Nicks i, jak sugeruje DampeS8N, niektóre kluczowe lokalizacje zainteresowania jako punkty orientacyjne. Aby uniknąć problemu AI „przekraczania kręgu”, po prostu znacznie
zwiększę

2

Twoim problemem tutaj jest to, że A * jest algorytmem znajdującym najszybszą drogę do celu. Jeśli to są twoje główne kryteria „dobrej” ścieżki, nic dziwnego, że wszyscy twoi aktorzy podejmują te same decyzje.

Musisz zmodyfikować kryteria jakości ścieżki, aby „najkrótszy najlepszy” nie był jedynym czynnikiem. Element losowości jest w tym kluczowy, ale nie tak bardzo, że szkodzi inteligencji poszukiwania ścieżki (tzn. Aktorzy idą głupio okrężnymi ścieżkami do celu).

* Wyszukiwanie ścieżki jest z natury naiwne, ponieważ zwykle zakłada, że ​​aktor ma doskonałą wiedzę na temat całej trasy, zanim zacznie. To zawsze będzie wyglądać nierealnie. Rozwiązanie sugeruje, że wybrane cele pośrednie są o krok od tego - AI stara się zbliżyć do celu, ale próbuje nawigować tylko w małych sekcjach naraz (jest to analogiczne do prawdziwego życia, w którym można nawigować tylko tak daleko) jak widzisz, a gdy przemierzasz więcej ścieżki, możesz widzieć dalej).

Być może poleciłbym prostszy sposób patrzenia na to. Kiedy szukasz ścieżki, nie utrzymuj tylko jednej najlepszej ścieżki, jaką do tej pory znalazłem. Zamiast tego zbierz zestaw najlepszych 5 lub 10 ścieżek. Użyj progu, aby odrzucić oczywiste wartości odstające. Np. Jeśli najlepsza ścieżka przemierza 20u, aby dostać się do celu, następne najlepsze trawersy 21u, a następne po niej - 50u. Ustaw próg o 20% większy niż najlepsza ścieżka, a więc odrzuć ścieżkę 50u, ponieważ jest ona głupio dłuższa. Teraz masz do wyboru kilka ścieżek i losowo wybierając z tego zestawu ścieżek, twoi aktorzy będą podejmować różne decyzje.

Jednak nie uzyskasz tego rodzaju informacji przy standardowym wyszukiwaniu A *, więc myślę, że będziesz musiał zmodyfikować algorytm lub użyć czegoś innego, aby zebrać zestaw możliwych ścieżek.


1

Jeśli masz niewielki zestaw powtarzających się wrogów (lub typów wrogów), możesz spróbować nadać im osobowości wpływające na ich ruchy. Nie muszą to być wielkie rzeczy, tylko rzeczy, które pojawiają się co jakiś czas. Dobrym przykładem tego są duchy z Pac-Mana. Niech Twoje A * zostanie podzielone na kilka celów pośrednich. Może jeden wróg jest naprawdę głupi i łatwo się gubi, kierując się w losowym kierunku co trzeci węzeł (inny niż bezpośrednio do tyłu). Bądź kreatywny.

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.