Szacowanie kosztów w systemie GOAP

9

Obecnie rozwijam system GOAP w Javie. Wyjaśnienie GOAP można znaleźć na stronie http://web.media.mit.edu/~jorkin/goap.html . Zasadniczo używa A * do kreślenia akcji, które mutują stan świata.

Aby zapewnić uczciwą szansę na wykonanie wszystkich Akcji i Celów, używam funkcji heurystycznej do oszacowania kosztu zrobienia czegoś. Jaki jest najlepszy sposób oszacowania tego kosztu, aby był porównywalny ze wszystkimi pozostałymi kosztami?

Na przykład oszacowanie kosztu ucieczki przed wrogiem w porównaniu z atakowaniem go - w jaki sposób należy obliczyć koszt, aby był porównywalny?

fullwall
źródło
Używamy GOAP do naszej gry RTS i wkrótce opublikujemy więcej takich samouczków: indiedb.com/games/attack-of-the-gelatinous-blob/news/...
Erlend

Odpowiedzi:

4

Aby wszystkie koszty były porównywalne, wystarczy użyć tej samej heurystyki dla wszystkich działań. Na przykład wszystkie działania mają listę potencjalnych wyników, a wszystkie wyniki mają określoną wartość dla jednostki.

Na przykład jest głęboki basen z wodą i istota jest spragniona. Dlatego patrzymy na akcję, którą ma pula, aby zaspokoić tę potrzebę:

Najpierw priorytety bytu związane z tymi miejscami, możesz nazwać je modyfikatorami. Niektóre z nich zmienią się z czasem i zależą od jednostki. Na przykład mrówka może mniej martwić się o przetrwanie, a bardziej o obawy kolonii. Lub jeśli jakaś istota przez pewien czas nie pije, priorytet zaspokojenia pragnienia może zastąpić innych.

Priorytety podmiotu :

Zaspokój pragnienie: 40
Pozostań suchy: 10
Pozostań przy życiu: 100

Zatem co reprezentuje lokalizacja:

Lokalizacja : Basen
Działanie : Zbierz wodę
* Potencjalne wyniki: * :
Zaspokój pragnienie - (-95) Zmoknij
- 10
Utonięcie - 1

Możemy więc obliczyć ten koszt działania przy: (40 * -95) + (10 * 10) + (100 * 1) = -3600

Gdzie może wyglądać zbieranie wody z szalejącej rzeki:

Lokalizacja : Szalejąca rzeka
Działanie : Zbierz wodę
* Potencjalne skutki: * :
Zaspokoić pragnienie - (-95) Zmoknąć
- 90
Utonąć - 60

(40 * -95) + (10 * 90) + (100 * 60) = 3100

Jest więc zdecydowanie lepszy wybór do zbierania wody z basenu. Może gdyby tylko szalejąca rzeka była jedynym wyborem, istota poczekałaby, aż jej zaspokojenie pragnienia stanie się bardzo wysokie, zanim spróbuje rzeki.

Zacznij od uproszczenia. Wystarczy kilka zmiennych, które można zastosować bardziej globalnie. Jak pozostać przy życiu, zaspokoić potrzeby. W przykładzie walki lub ucieczki musisz nadać każdemu bytowi ocenę bojową, aby mogli skutecznie rankingować się względem drugiego bytu dla celów punktowych.

MichaelHouse
źródło
Wielkie dzięki! Prognozowanie wszystkich potencjalnych wyników wydaje się lepszym pomysłem niż to, co miałem.
fullwall 11.12.12
0

Wiem, wiem, minęło sporo czasu.

Rzeczywiście, w GOAP wdrożonym w 2005 roku przez Jeffa Orkina w FEAR (i ponownie wykorzystany w sequelach, rozszerzeniach i ... Shadow Of Mordor) akcje mają stałe koszty, od 0,5 do 8. Ogólnie rzecz biorąc, koszt ataku droższe niż koszt obrony. Koszty te są dostępne w bazie danych gry Free FEAR SDK (2008); tutaj są:


{{Animate, 1}, {Attack, 6}, {AttackBurstLimited, 5}, {AttackCrouch, 5}, {AttackFromAmbush, 4}, {AttackFromArmored, 4}, {AttackFromArmoredBounded, 4}, {AttackFromCover, 4}, { AttackFromVehicle, 1}, {AttackFromView, 4.5}, {AttackGrenadeFromCover, 2}, {AttackLunge3D, 1}, {AttackLungeMelee, 1}, {AttackLungeSuicide, 1}, {AttackLungeUncloaked, 1}, {AttackMelee, 3} 1}, {AttackMeleeUncloaked, 3}, {AttackReady, 7}, {AttackTurret, 6}, {AttackTurretCeiling, 6}, {BlindFireFromCover, 2}, {Charge, 1}, {DeathOnVehicle, 1}, {DismountNodeUncloaked , {DismountVehicle, 1}, {DodgeCovered, 1}, {DodgeOnVehicle, 1}, {DodgeRoll, 2}, {DodgeRollParanoid, 2}, {DodgeShuffle, 3}, {DrawWeapon, 1}, {EscapeDanger, 0.5}, { FaceNode, 1}, {FlushOutWithGrenade, 3}, {Follow, 3}, {FollowHeavyArmor, 2}, {FollowPlayer, 2}, {FollowPlayerFidget, 1.8},{FollowWaitAtNode, 4}, {GetOutOfTheWay, 1}, {GotoNode, 1}, {GotoNode3D, 1}, {GotoNodeDirect, 1}, {GotoNodeOfType, 1}, {GotoTarget, 4}, {GotoTarget3D, 4}, {GotoTarget , 8}, {GotoValidPosition, 1}, {HolsterWeapon, 1}, {Idle, 2}, {IdleFidget, 1}, {IdleOnVehicle, 1}, {IdleTurret, 2}, {InspectDisturbance, 2}, {InstantDeath, 1 }, {InstantDeathKnockDown, 1}, {KnockDownBullet, 2}, {KnockDownExplosive, 2}, {KnockDownMelee, 2}, {LongRecoilBullet, 3}, {LongRecoilExplosive, 3}, {LongRecoilHelmetPiercing, 3}, {LongRecoilHelmetPiercing, 3}, {LongRecoilHelmetPiercing, 3} {LookAtDisturbance, 1.5}, {LookAtDisturbanceFromView, 3}, {LopeToTargetUncloaked, 1}, {MountNodeUncloaked, 1}, {MountVehicle, 1}, {ReactToDanger, 1}, {Reload, 5}, {ReloadCovered, 1}, , 5}, {ShortRecoilMelee, 4}, {Stunned, 1}, {SuppressionFire, 2}, {SuppressionFireFromCover, 1}, {SurveyArea, 1},{TraverseBlockedDoor, 1}, {TraverseLink, 2}, {TraverseLinkUncloaked, 1}, {Uncover, 1}, {UseSmartObjectNode, 3}, {UseSmartObjectNodeMounted, 1}}


Ale nie jest tak we wszystkich implementacjach GOAP i, na przykład, Tomb Raiders mają zmienne koszty (np. Odległość do akcji Goto).

Akcje mają również warunki wstępne i niektóre akcje muszą być odtwarzane pomimo architektury GOAP (np. Odgrywanie „ogłuszonej” animacji w reakcji gwałtownie obniżającego się zdrowia - pomimo celu „Zabij wroga” i planu, który GOAP powraca, aby osiągnąć ten cel). W twoim przykładzie, tj. Ucieczka przed atakiem, poziom zdrowia może być warunkiem wstępnym (i nie musisz mieć zmiennych kosztów).

Lub funkcja członkowska Check_Costs () jest wykonywana przed wszystkim innym, w oparciu o priorytety Michaela, i zwraca koszt dynamiczny.

Teraz zauważ, że w Shadow Of Mordor twórcy gier próbowali grać kosztami akcji, aby wpłynąć na to, co zostanie wykonane na ekranie. Okazuje się, że nie jest to takie łatwe, a nawet tanie działania nie pojawiają się tak często: AI w grze wspiera gracza; jeśli gracz nie zrobi tego, co jest oczekiwane, sztuczna inteligencja po prostu to poprze i ... to, co pojawi się na ekranie, nie będzie zgodne z oczekiwaniami projektowymi.

TheAIHedgehog
źródło