很多程序员一谈到做 AI、设计 AI 框架的时候,第一步就想的是要用状态机还是行为树。其实这只是实现方式,而不是 AI 的顶层设计。无论状态机还是行为树,都可以满足绝大部分 AI 的需求,一定程度上没有绝对的优劣之分。而 AI 最为关键的问题,则是更为抽象的顶层设计。
AI 要更人性化还是更机械化?
这个问题,我相信很多人从来没有想过。可能有的程序会直觉地认为要更像人,但更像人的 AI 往往有不可预知行为,其行为有偶然性以及极多自治逻辑。在有的游戏类型中,往往就需要 AI 更机械而不是更像人。
-
在模拟经营游戏中,玩家希望智能体能按照设定工作、休息。游戏中智能体可以出些意外行为,但绝大部分时间都是按照既定工作规划在行动。此时 AI 的设计就应该更机械化。
-
在 RPG 游戏中,玩家希望智能体就是一个个鲜活的生命,游戏中的各个 NPC 自洽、多样化的行为恰好就是游戏沉浸感所在。此时 AI 的设计就应该更人性化。
可以看到,不同的游戏需求对 AI 的要求是不一样的,甚至可以说是两个方向。而我们在游戏开发中,如果不先想好 AI 的行为模式就进行开发,往往会南辕北辙、事倍功半。
人性化的 AI
人性化的 AI,顾名思义,就是要让智能体更像真实的人类。真实的人类行为,既有确定性,也有不确定性。例如一个人朝九晚五地上班,那他白天在公司是,晚上在家,这是几乎可以去定的。但这个人中午吃什么,晚上下班后做什么事情,往往是不确定的。抽象成数学语言,那人的行为就是概率性质的:
-
早上9点,99%的概率去上班,1%的概率请假。
-
中午12点,30%概率吃面条,25%概率吃麦当劳……
-
晚上5点,75%的概率下班回家,25%的概率加班。
-
晚上7点:30%概率自己做饭,5%概率聚餐,15%概率去亲戚家蹭饭……
除行为具有概率性的不确定之外,完成某一样行为也会有多种途径。就拿自己做晚饭这一行为来说,可选的菜品就多种多样,还可以选择不做饭吃零食,做饭还有成功率。
同时,真实的人类还会有记忆。例如中午没吃上饭,下午就心情不好;晚上和朋友聚餐,喝得酩酊大醉,结果第二天上班迟到等等。如果考虑到人与人之间的交互,则不同智能体之间还会有互动,有情绪影响等。
从上文分析可得,人性化的智能体每时每刻做的事情,都有一定的确定性,同时也有充分合理的不可预知性。而完成每一项事务的方式方法,又充满各种各样的自治行为。智能体的每一项选择、行为及结果,还会纳入记忆,从而对智能体的行为产生深远影响。在对 AI 系统进行顶层设计的时候,就要充分考虑这些特点,在开发之初就要纳入考量:
-
模糊逻辑:智能体的每一项决策都会先进行模糊化,然后再去模糊化做决策。就像中午吃饭的选择,公司楼下每一家饭店的开张和倒闭,都可能对决策产生影响。我们设计智能体逻辑时,不可能预知到未来情境变化,所以一开始就不会设计成百分百确定的行为决策。这样确实会带来不可控性,但能使得智能体更像是一个活生生的人。
-
自治行为:从公司到家里,可以走路、骑车、打车、公交,方法多种多样,只要是这个世界规则允许,就都可以采用。智能体在游戏中的逻辑也一样:当其饥饿时,有多种方式解决,只要世界规则允许。
-
记忆:实际游戏开发中,当然不可能这的记住每一件事(现实生活中的人也记不住),更常用的方法就是设计多种技能、属性作为游戏规则的一环。例如做饭做多了,厨艺值就会上涨;经常和某个人吵架,在厌恶列表中就会增加一个人;尝试新店开张时常常不满意,就会降低玩家的冒险概率……
总而言之,人性化的AI,就不要想着精确控制每一个智能体的行为。在设计 AI 系统时,则只需要关注自身能力、记忆和周围环境即可,而不需要知道其他智能体的决策。其实照这个思路进行顶层设计,并不需要很复杂的机制就能使得智能体非常多样化,千人千面。
值得一提的是,这部分游戏中,往往环境中的资源几乎是无限的。我们从来没有听说过某个 RPG 类游戏出现NPC 把世界的食物吃光了这种情况,资源总是能“虚空”生产出来。所以智能体总会有某个自治行为能解决自己的问题。
机械化的 AI
可能很多人都以为机械化的 AI 不好,玩家对智能体一眼假。但在绝大部分策略游戏、甚至体育模拟类游戏中,AI 都是偏向机械化的:模拟经营类游戏,智能体就是流水线上的螺丝钉;足球游戏中,智能体就是坚决地战术执行者;RTS 游戏中,智能体则完全没有自我意志。而且在这些类型的游戏中,给 AI 设计得人性化了,往往还有副作用:工人不去上班或天天摸鱼、足球队员只传给关系好的球员而不是玩家、玩家命令骑兵冲锋反而临阵脱逃;这些都会极大地降低玩家的游戏体验。
不难看出,机械化的 AI 都绝对服从一个“绝对意志”:有一个中心管理者负责控制每一个智能体的具体行为,而智能体本身只是执行而已。
-
上层管理者:上层管理者可以说是这类 AI 的核心,管理者可以是玩家,也可以是内置的一个智能体,也可以两者结合,但不可或缺。智能体的所有决策都是由上层管理者决定,而不是智能体自行判断。
-
自治行为:机械化 AI 也会有自治行为,但这样的行为(与人性化 AI 相比)更为基础,往往只有自行寻路、做饭、传球射门等一系列单元事务。
-
异常状态:单个智能体,或者环境出现异常状态(饥饿、敌人入侵等),则是由上层管理者统一调配资源执行策略以消除异常状态。这自然就会要求上层管理者能感知、收集、判断各个异常状态并进行决策。而在人性化AI中,其实不存在所谓的异常状态,或者说,很多异常状态都是正常行为的一部分(例如饥饿、疲劳、口渴,都是属于智能体的正常行为流程而不是异常)。
在机械化的 AI 上层设计的过程中,最容易出现的错误,就是让智能体自行去解决自身的异常状态。例如在模拟经营游戏中,当某个智能体出现饥饿,则自己去食堂吃饭。这个逻辑表面上看没什么问题,但在模拟经营游戏中,资源往往是有限且竞争的,于是就会出现以下几个问题:
-
智能体想去食堂吃饭,食堂现在没有食物供应。
-
智能体走在半路上,食物被其他人吃了。
-
离食堂距离近的智能体,总能很快吃到食物,哪怕不怎么饿。而远离食堂的智能体,饿晕了都吃不上饭。
-
食堂需要排队,有座位限制。结果明明食物充足却迟迟吃不上饭。
这些问题,如果只靠一个智能体的判断是无解的,他感知到的环境随时都在发生变化。哪怕现在食堂空无一人,当他走到食堂门口的时候就爆满。这些问题对于单个智能体就是混沌,无法求解,只有对于上层管理者而言才是能充分感知并求解的。
还是这个吃饭问题,上层管理者会收集当下有多少智能体出现了饥饿警戒,然后根据优先级安排各个智能体去食堂吃饭(或是统一时间吃饭)。所以排队、被他人占用食物、近水楼台先得月,这些问题统统不存在。当一个智能体到达食堂时,一定有一份食物,且一定有他的座位,这都是上层管理者提前安排好的。
综上所述,在部分游戏类型中,玩家更希望整体是机械化的 AI 。同时,只有存在上层管理器统领全局,才能使得整个系统正常运转。
非此即彼?
这两种 AI 只能选择一个方向吗?
我觉得大部分情况都是这样,至少会选择一个类型为主。我们在 RPG 游戏中会希望商店准点开门,在足球比赛中也乐于见到队友灵光一闪。但这些情况都需要不影响游戏本身的游玩乐趣,需要保证游戏核心玩法的稳定。就像模拟经营游戏中,可以由一点刁民,但不能太刁。
人性化 AI 强调变化和多样性,给玩家新鲜感。机械化 AI 强调稳定性和确定性,给玩家安全感。到底如何选择,就看游戏的追求。我觉得这更多地是游戏设计的取舍问题,我们不能既要他更白,又要他更黑。