效用系统简介
AI的基本框架的是感知->决策->行为
效用(Utility)同有限状态机、行为树一样都属于决策的方式,其核心是给感知到的不同信息以及不同行为赋予不同的效用值(Utility Value),并选择效用值最高的行为。
例如:
对于感知信息:距离可以对应一个效用值,可以不同阶段的距离对应不同的效用值,可以有个函数更具距离计算效用值,这个函数叫效用函数(Utility Function)
对于行为:距离、血量、敌人数量、技能等都会对选择什么样的战斗行为有影响,战斗行为分为攻击、防御、闪避、挣脱、辅助等五大类,这些信息是行为的影响因素,每种因素有不同的权重值,通过不同的效用函数累加计算得到最终不同行为的效用值,选择效用值最高的行为
效用函数时效用系统的核心,有以下常用的效用函数:
- 分段常数:例如当距离<10,效用值 = 1;当10<=距离<50,效用值=0.5;当距离>=50,效用值= 0.1
- 线性函数:y = ax + b
- 指数函数:y = 1-e^-x
- sigmoid函数
(效用值通常为0~1,因为要用到函数,为计算统一这样取,通常需要对各种信息做归一化计算)
在复杂的决策中,信息和行为是多样的,可以自然做分层,实现分层效用。
更进一步的,可以用代价作为效用的另一面,选择代价最小的,或着综合代价和效用做决策。
此外,因为各类效用值繁多,计算量大,需要平衡好性能和表现问题。
因为效用需要用到函数,最终角色表现出来的行为是根据当前环境和目标状态动态调整的,有更大的灵活性,会有更为丰富和更为自然的行为表现。
但是效用函数设置的不合适,会导致角色出现难以预测的行为,也即不可控。
其难度在于设计出合适的效用函数,这需要通过大量测试做调参。
而FSM和BT是在确定性的控制下做的,即角色的所有行为的表现都遵循预先设置好的条件,这些条件都是离散化的数值,更便于做调整。需要更多的行为表现,就需要设置更多更细的数值。
通常来说,为了增加一定的自由度,我们会将效用系统嵌入行为树中,即通过效用函数代替某些离散的条件节点或执行某些具体的动作。
例如:当行为树确定执行闪避行为时,可以通过效用系统确定走到到什么位置;或者找什么掩体