В настоящее время я занимаюсь разработкой системы GOAP на Java. Объяснение GOAP можно найти по адресу http://web.media.mit.edu/~jorkin/goap.html . По сути, он использует A * для построения графика между действиями, которые изменяют состояние мира.
Чтобы обеспечить реальную возможность выполнения всех действий и целей, я использую эвристическую функцию для оценки стоимости выполнения чего-либо. Каков наилучший способ оценить эту стоимость, чтобы она была сопоставима со всеми другими расходами?
Например, оценка стоимости бегства от врага и его атаки - как рассчитать стоимость, чтобы она была сопоставимой?
java
ai
path-finding
fullwall
источник
источник
Ответы:
Чтобы сделать все затраты сопоставимыми, вам нужно всего лишь использовать одну и ту же эвристику для всех действий. Например, все действия имеют список возможных результатов, и все результаты имеют определенную ценность для объекта.
Например, есть глубокий бассейн с водой, и сущность хочет пить. Итак, мы рассмотрим действие, которое есть в пуле для удовлетворения этой потребности:
Сначала приоритеты сущностей, связанных с этими местами, можно назвать их модификаторами. Некоторые из них будут меняться со временем и зависят от сущности. Например, муравей может меньше беспокоиться о том, чтобы остаться в живых, и больше о проблемах колонии. Или, если существо какое-то время не пьет, приоритет утоления жажды может превалировать над другими.
Приоритеты организации :
Утолить жажду: 40
Остаться сухим: 10
Остаться в живых: 100
Тогда, что представляет собой местоположение:
Расположение : Бассейн
Действие : Собрать воду
* Потенциальные результаты: * :
Утолить жажду - (-95)
Промокнуть - 10
Утонуть - 1
Таким образом, мы могли бы рассчитать стоимость этого действия по: (40 * -95) + (10 * 10) + (100 * 1) = -3600
Где сбор воды из бушующей реки может выглядеть так:
Расположение : Бушующая река.
Действие : Собрать воду.
* Потенциальные результаты: * :
Удовлетворить жажду - (-95)
Промокнуть - 90
Утонуть - 60
(40 * -95) + (10 * 90) + (100 * 60) = 3100
Таким образом, это явно лучший выбор для сбора воды из бассейна. Может быть, если бушующая река была единственным выбором, сущность подождет, пока ее жажда утоляет свою жажду, не станет очень высокой, прежде чем пробовать реку.
Возможно, вы захотите, чтобы все было намного проще, начиная с самого начала. Просто есть несколько переменных, которые могут применяться более глобально. Как остаться в живых, удовлетворить потребности. В вашем примере с боем или бегством вы должны будете дать каждой сущности боевой рейтинг, чтобы они могли эффективно ранжироваться против другой сущности в целях оценки.
источник
Я знаю, я знаю, это было довольно давно.
Действительно, в 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}, {AttackMeleee, 3}, AttackMelee, 3 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}, {Перейти к , 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}, 3}, 3}, 3}, 3}, 3}, 3}, 3}, 3}, 3}, 3}, 3}, 3}, {} {LookAtDisturbance, 1.5}, {LookAtDisturbanceFromView, 3}, {LopeToTargetUncloaked, 1}, {MountNodeUncloaked, 1}, {MountVehicle, 1}, {ReactToDanger, 1}, {Reload, 5}, {ReloadCovered, 1}, {ReloadCrouch , 5}, {ShortRecoilMelee, 4}, {Stunned, 1}, {SuppressionFire, 2}, {SuppressionFireFromCover, 1}, {SurveyArea, 1},{TraverseBlockedDoor, 1}, {TraverseLink, 2}, {TraverseLinkUncloaked, 1}, {Uncover, 1}, {UseSmartObjectNode, 3}, {UseSmartObjectNodeMounting, 1}}
Но это не так во всех реализациях GOAP, и, например, Tomb Raiders имеют переменные затраты (например, расстояние для действия Goto).
Действия также имеют предварительные условия, и некоторые действия должны выполняться, несмотря на архитектуру GOAP (например, воспроизводить «ошеломленную» анимацию в реакции, быстро снижающей здоровье - несмотря на цель «Убить врага» и план, который GOAP возвращает для достижения этой цели). В вашем примере, то есть в бегстве от атак, уровень здоровья может быть предварительным условием (и нет необходимости иметь переменные затраты).
Или функция-член Check_Costs () выполняется раньше всего на основе приоритетов Майкла и возвращает динамическую стоимость.
Теперь обратите внимание, что в Shadow Of Mordor разработчики игр пытались поиграть со стоимостью действий, чтобы повлиять на то, что будет выполняться на экране. Оказывается, это не так просто, и даже дешевые действия не так часто появляются: ИИ в игре поддерживает игрока; если игрок не сделает то, что ожидается, AI просто поддержит это, и ... то, что появится на экране, не будет тем, что ожидал дизайн игры.
источник