文章目录
课前QA
- 怎么看待 AI 读取玩家操作指令:可以简单读取一下,让 AI 更智能,但不能给太高权限(收集所有信息)
- AI行为的预算:AI 可以低频地更新底层的行为(比如1s一次),高频地更新细节的行为,根据权重和优先级调整,比如单机的ai时间预算可以比较高
- 能不能将 AI 计算用网络服务器计算:可以,专门计算 AI的服务器或者分布式计算都可以,但是需要信息上传的时间,分布式还需要上传多份
一,层次任务网络(Hierarchical Tasks Network,HTN)
层次任务网络是经典的游戏 AI 技术。
- 上一课的行为树更像是一个无脑的反应机器,其根据设定功能行为,是有构的;
- 而HTN是从任务或目标出发,把目标分为几个步骤,步骤内可以包含不同选项,并根据自身状态选择合适的行为一次完成步骤,完全类似人的思考过程,可以更好地表达 AI 自身的意志和驱动力。
1.1 HTN Framework
World State :AI 对世界的主观认知(而不是真实世界的客观描述),反馈到Planner
Sensors :传感器、感知器,从游戏中抓取状态
HTN Domain:层次化树状 task
Planner :制定的计划 task
plan runner:执行计划,在 task 结束后更新 World State
1.2 HTN Task Types


1.2.1 Primitive Task基本任务
primitive task 一般表示一个具体的动作或行为。见上图左,每个 primitive task 都有 precondition( world state properties)、action 以及 effects (改变properties)三个要素。
1.2.2 Compound Task符合任务
见上图右,compound task 由很多method构成,每个method都有自己的precondition;我们把这些方法按照一定的优先级组织起来并且在执行时按照优先级高到低的顺序进行选择(更像||的逻辑)。每个method还可以包含其它的 primitive task 或者 compound task,当方法内所有的 task 都执行完毕则表示任务完成。(感觉是行为树的拓展包装)
1.3 Planning
接下来就可以进行规划了,我们从 root task 出发不断进行展开逐步完成每个任务。
-
从 root task 开始检查 precondition,选择一个满足条件的 compound task
-
对这个当前指向的 compound task 展开
在这个展开的 task 中,先把 world state 拷贝一份,然后检查 precondition,如果满足,就假设这个 task 里的 action 全部可以执行成功,并把其 effect 修改到拷贝的 world state里(带着目的预测)。如果执行时发现不能成功执行,再层层返回false,去选择下一个task
-
重复第二步直到没有 task 为止
最后输出的plan里就只有Primitive Task,再把plan交给runner执行
- Run plan:依次执行 task,直到所有 task 都成功或者有一个 task 失败(游戏时动态的,可能决策时可以,执行到这里时又不行了)
1.4 Replan
- 需要重新计划的情况:
- 在Run plan时有task执行失败,就需要重新计划;
- 计划成功执行完后,或者没有task时,需要计划下一步动作;
- world state被修改后被sensor感应到时,也需要重新计划
1.5 总结
- 优点:HTN 和 BT 非常相似,但是是BT的高阶版本,但HTN更加灵活、符合人的直觉、也更易于设计师进行掌握;可以带着目的预测,任务计划也更长程
- 缺点:由于用户行为不可预测,因此task很容易失败或满足不了precondition;并且world state与任务effect影响对设计师是挑战(比如忘记设置某个条件;或者如果 task 链路过长但是环境变化很快,那么 AI 的行为就会变化很快,看上去振动一样)
二,目标导向行为规划Goal-Oriented Action Planning(GOAP)
GOAP方法更加自动化,并且不同于向前planning,GOAP是backward planning;因此和前面介绍过的方法相比 GOAP 一般会更适合动态的环境。-----虚幻的EQS就是基于GOAP
2.1 GOAP Structure
GOAP 的整体结构与 HTN 非常相似,只是 domain 被替换为 goal set 和 action set。
在HTN中,所谓“目标Goal”是几个task集合成的,写在注释里的;而在GOAP中“目标”有非常严格的数学定义,可以数学表达;并且在HTN中的计划,而在GOAP中应该叫“规划”
2.1.1 Goal Set
goal set 表示 AI 所有可以达成的目标。在 GOAP 中需要显式地用相应的状态来定义。
Goal有Precondition、Priority优先级、States状态集合三个属性,状态集合就是用来描述目标的。
2.1.2 Action Set
action set 类似 primitive task ,它表示 AI 可以执行的行为,它包含precondition、effct和cost三个属性。其中cost是由开发者定义的代价权重,用于排序优先级(代价低的优先)
action set 没有树状结构,所以要用 cost 来选 action
2.2 Backward Planning
GOAP在规划时会从目标来Backward倒推所需要执行的动作,反向规划是一种类似人类的思考方式:
1.在优先级排序的目标序列中选取第一个precondition已经满足的目标goal。
2. 然后查询实现目标需要满足的状态state,筛选目前world state中没有满足的state,存入“待满足state”堆栈。
3. 依次获取堆栈里的state,并找到其满足其对应的action,加入plan堆栈
4. 如果action也有未满足的state需求,也把这些state加入存入“待满足state”堆栈,(递归),直到所有的状态需求都得到了满足。
GOAP 中除了“能够达成目标”以外,最核心的点就在于如何选择最小代价路径达成目标,包括选择目标和选择action。这个问题可以转换为路径规划为题,可以用代价图来求解。