Оцінка витрат у системі GOAP


9

Зараз я розробляю систему GOAP на Java. Пояснення GOAP можна знайти на веб- сайті http://web.media.mit.edu/~jorkin/goap.html . По суті, за допомогою A * можна побудувати графік між діями, що мутують світову державу.

Щоб забезпечити справедливий шанс для виконання всіх дій і цілей, я використовую евристичну функцію, щоб оцінити витрати на щось. Який найкращий спосіб оцінити цю вартість, щоб вона була порівняною з усіма іншими витратами?

Як приклад, оцінка вартості втечі від ворога проти нападу на нього - як слід розраховувати вартість, щоб бути порівнянною?


Ми використовуємо GOAP для нашої гри в RTS, і незабаром будемо публікувати більше таких навчальних посібників: indiedb.com/games/attack-of-the-gelatinous-blob/news/…
Ерленд

Відповіді:


4

Щоб порівняти всі витрати, вам потрібно використовувати однакову евристику для всіх дій. Наприклад, усі дії мають перелік потенційних результатів, і всі результати мають певне значення для суб'єкта господарювання.

Наприклад, є глибокий басейн з водою, і сутність спрагує. Тож ми розглядаємо дії, доступні басейну для задоволення цієї потреби:

По-перше, пріоритети сутності, пов'язані з цими місцями, можна назвати ці модифікатори. Деякі з них змінюватимуться з часом і залежать від сутності. Наприклад, мураха може менше турбуватися про те, щоб залишатися живим, і більше турбувати колонії. Або якщо суб'єкт господарювання деякий час без напою пішов, пріоритет задоволення спраги може перевищити інших.

Приоритети суб'єктів :

Задовольте спрагу: 40
Залишайтеся сухими: 10
Будьте живі: 100

Тоді, що представляє місцеположення:

Розташування : Басейн
Дія : Набирайте воду
* Потенційні результати: * :
Задовольте спрагу - (-95)
Намочіть - 10
Заглушіть - 1

Тож ми могли б обчислити, що вартість дії складе: (40 * -95) + (10 * 10) + (100 * 1) = -3600

Де може виглядати збір води з бурхливої ​​річки:

Розташування : Бурхлива річка
Дія : Набирайте воду
* Потенційні результати: * :
Задовольте спрагу - (-95)
Намочіть - 90
Потопите - 60

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

Тож явно кращий вибір набрати воду з басейну. Можливо, якби бурхлива річка була єдиним вибором, суб'єкт господарювання зачекав би, поки її пріоритет спраги підуть дуже високо, перш ніж спробувати річку.

Можливо, ви хочете, щоб все було набагато простіше, починаючи. Просто є кілька змінних, які можна застосувати більш глобально. Як і залишитися в живих, задовольнити потреби. У прикладі бою чи польоту вам потрібно буде дати кожному суб'єкту бойових рейтингів, щоб вони могли ефективно скласти проти інших суб'єктів у цілях оцінки.


Дуже дякую! Прогнозування всіх потенційних результатів звучить як краща ідея, ніж у мене.
fullwall

0

Я знаю, я знаю, минув досить довго.

Дійсно, у GOAP, реалізованому у 2005 році Джефом Оркіном у FEAR (та повторно використаний у продовженнях, розширеннях та ... Shadow Of Mordor), дії мають фіксовані витрати, починаючи від 0,5 до 8. Загалом, вартість атаки значна дорожче, ніж вартість захисту. Ці витрати можна отримати в ігровій базі даних Free FEAR SDK (2008); ось вони:


{{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}, {AttackMuneee, AttackMongee 1}, {AttackMeleeUncloaked, 3}, {AttackReady, 7}, {AttackTurret, 6}, {AttackTurretCeiling, 6}, {BlindFireFromCover, 2}, {Charge, 1}, {DeathOnVehicle, 1}, {DismountNodeUncloaked, 1} , {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}, {GotoTarget3D, 4}, {GotoTarget3D, 4}, {GotoTarget3D, 4} , 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}, {LongRecoilHelmet, 3}, {LongRecoilHelmet {LookAtDisturbance, 1.5}, {LookAtDisturbanceFromView, 3}, {LopeToTargetUncloaked, 1}, {MountNodeUncloaked, 1}, {MountVehicle, 1}, {ReactToDanger, 1}, {Перезавантажити, 5}, {ReloadCovered, 1} , 5}, {ShortRecoilMelee, 4}, {приголомшений, 1}, {SuppressionFire, 2}, {SuppressionFireFromCover, 1}, {SurveyArea, 1},{TraverseBlockedDoor, 1}, {TraverseLink, 2}, {TraverseLinkUncloaked, 1}, {Розкрити, 1}, {UseSmartObjectNode, 3}, {UseSmartObjectNodeMount, 1}}


Але це не так у всіх реалізаціях GOAP, і, наприклад, Tomb Raiders мають змінні витрати (наприклад, відстань для дії Goto).

Дії також мають передумови, і деякі дії повинні бути відіграні, незважаючи на архітектуру GOAP (наприклад, відтворити "приголомшену" анімацію в реакції, що швидко знижує здоров'я - незважаючи на ціль "Вбити ворога" та план, який GOAP повертає для задоволення цієї мети). У вашому прикладі, тобто втеча від нападу, рівень здоров'я може бути передумовою (і не потрібно мати змінних витрат).

Або функція члена Check_Costs () виконується раніше всього іншого, виходячи з пріоритетів Майкла, і повертає динамічну вартість.

Тепер зауважте, що в Shadow Of Mordor розробники ігор намагалися пограти з витратами на дії, щоб вплинути на те, що буде виконуватися на екрані. Виявляється, це не так просто і навіть дешеві дії проявляються не так часто: AI в грі підтримує гравця; якщо гравець не зробить того, що очікується, AI просто підтримає це і ... те, що з'явиться на екрані, не буде тим, що очікував ігровий дизайн.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.