我目前正在用Java开发GOAP系统。有关GOAP的说明,请参见http://web.media.mit.edu/~jorkin/goap.html。本质上,它是使用A *绘制使世界状态发生变化的动作之间的关系。
为了给所有行动和目标提供公平的执行机会,我正在使用启发式函数来估算执行某项操作的成本。估算此成本以使其与所有其他成本可比的最佳方法是什么?
例如,估算逃避敌人和攻击敌人的成本-应该如何计算该成本是否具有可比性?
我目前正在用Java开发GOAP系统。有关GOAP的说明,请参见http://web.media.mit.edu/~jorkin/goap.html。本质上,它是使用A *绘制使世界状态发生变化的动作之间的关系。
为了给所有行动和目标提供公平的执行机会,我正在使用启发式函数来估算执行某项操作的成本。估算此成本以使其与所有其他成本可比的最佳方法是什么?
例如,估算逃避敌人和攻击敌人的成本-应该如何计算该成本是否具有可比性?
Answers:
为了使所有成本具有可比性,您只需对所有操作使用相同的试探法。例如,所有动作都具有潜在结果的列表,并且所有结果对实体都有一定的价值。
例如,有一个深水潭,实体渴了。因此,我们看一下池可用来满足该需求的操作:
首先,与这些地点相关的实体优先级,您可以将其称为修饰符。其中一些会随着时间而变化,并取决于实体。例如,一只蚂蚁可能不那么担心生存,而更担心殖民地问题。或者,如果某实体已经喝了一段时间,那么满足口渴的优先级可能会优先于其他实体。
实体优先事项:
满足口渴:40
保持干燥:10
保持活力:100
然后,该位置代表什么:
地点:池
操作:取水
* 可能的结果:*:
手托不渴- (-95)
弄湿- 10
淹死- 1
因此,我们可以计算出以下操作费用:(40 * -95)+(10 * 10)+(100 * 1)= -3600
从汹涌的河流中收集水的地方可能像:
地点:狂暴的河水
行动:收集水
* 潜在结果:*:
满足口渴-(-95)
弄湿-90
溺水-60
(40 * -95)+(10 * 90)+(100 * 60)= 3100
因此,从游泳池中收集水显然是更好的选择。也许如果汹涌的河水是唯一的选择,那么实体会等到满足其满足口渴的优先级变得很高之后再尝试河水。
您可能希望使事情从一开始就简单得多。只有一些变量可以在全球范围内应用。喜欢生存,满足需求。在您的战斗或逃跑示例中,您需要给每个实体一个战斗等级,以便他们可以有效地与另一个实体进行排名,以达到得分目的。
我知道,已经过去了一段时间。
的确,在Jeff Orkin在2005年由Jeff Orkin在FEAR中实施的GOAP(并在续集,扩展名和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},{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},{GotoTargetLost ,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},{LongRecoilHelMePiercing,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},{UseSmartObjectNodeMounted,1}}
但这并非在所有GOAP实施中都是如此,例如,古墓丽影具有可变的成本(例如Goto行动的距离)。
动作还具有先决条件,尽管GOAP体系结构仍然必须执行某些动作(例如,在快速降低健康状况的情况下播放“惊呆”的动画-尽管存在“杀死敌人”目标以及GOAP为实现该目标而返回的计划)。在您的例子中,即逃避与攻击,健康水平可能是前提条件(并且无需承担可变成本)。
或者,根据Michael的优先级,首先执行Check_Costs()成员函数,然后返回动态成本。
现在,请注意,在《暗影魔多》中,游戏开发人员试图发挥动作的成本,以影响将在屏幕上执行的动作。事实证明,并不是那么容易,甚至便宜的动作也不会经常出现:游戏中的AI支持玩家;如果玩家没有完成预期的工作,那么AI会支持它,并且...屏幕上显示的内容将不会达到游戏设计的预期。