时雨小径 May the Spirit be with you

战棋游戏AI设计心得体会

来说说最近写的战棋AI的一点点心得. 要做到运筹帷幄, 进行基于全局的统筹规划, 目前来看难度太高, 还是觉得从写一个好的考虑局部决策的AI比较现实.

作为一个最基本的战棋游戏, 每一个单位应该具有基本的属性,比如体力,行动力, 攻击力, 防御力, 攻击范围等等.
而对于回合制的战棋游戏来说, AI需要在每一个回合做出一个决策, 在这里, 选取决策应该是一个决策集合里面AI认为最好的一个. 我们希望AI能合理地选择出一个AI, 因此首先需要将决策量化.

量化决策

如何量化一个决策? 首先我们需要考虑AI做决策的目的是什么, 比如一个AI的目的是杀死全部敌人, 而另一个的目的是支撑更多回合, 这两个所使用的量化手段就会有不同.

因为基本的战棋游戏就有两种策略, 进攻和防守, 所以在一开始我们可以定义一系列AI的策略类型, 举个简单的例子就是分成四个:

  1. 进攻型
  2. 极端进攻型
  3. 防守型
  4. 极端防守型

先记住这些, 我们后面会用到.

再接着说量化方法, 这是我最近考虑到的一些可以量化的因素:

决策的进攻性 – 当这个值越大表示该决策可以产生越大的进攻性

对这个变量产生影响的因素可以有:

  1. 与所有敌人的距离总和. 距离可以是欧几里得距离, 也可以是更具体的考虑地图移动性的'实际距离'.
  2. AI做出该决策后所处位置将有能力攻击到的敌人.
  3. 如果该决策是攻击, 那么考虑对攻击对象产生的伤害, 并量化该伤害对敌方总体产生的削弱影响.

决策的危险性 – 当这个值越大表示该决策会对当前AI造成越大的潜在危险

  1. 与所有敌人的距离. 同上.
  2. AI做出该决策后所处位置将有可能被攻击到的敌人.
  3. 如果该决策是攻击, 且攻击有可能无法杀死敌人, 考虑被反击造成的伤害对我方总体产生的削弱影响.

考虑这些因素之后, 对于每一个决策, 得到两个值, $A_i$ 和 $D_i$, 在对它们进行标准化之后, 我们可以根据策略类型$f$得到该决策的一个量化值.

$Score_i = f_{s,a}(A_i) + f_{s,d}(D_i)$

比如说极端进攻型的量化函数就可以是$ Score_i = 0.8 * A_i - 0.2 * D_i $, 只有当危险性远大于攻击性时, AI才认为该决策更'差'一些.

执行顺序

简单量化完之后, 还有一个问题, 那就是AI执行的顺序.

因为AI对决策进行量化都是根据当前形势, 而当一个AI执行完之后, 往往会导致另外一个AI不能执行其最优决策, 比如一个步兵先动, 挡住了一条路, 结果好几个骑兵被堵住无法通过.

跟妹子讨论了这个问题, 给了我一个从经济学方面考虑的方法, 在决定顺序时引入机会成本的概念. 对每一个AI的最优决策, 量化该决策的机会成本, 然后选取拥有当前机会成本最小的AI执行它的决策. 不断迭代, 直到每一个AI都执行完毕. 我觉得这个方法挺好的, 在不想遍历所有可行顺序的情况下, 应该可以找到一个比较优秀的解.

那么怎么量化机会成本呢, 最简单的就是假设某个AI执行了它的最优决策, 然后在这个局势下计算所有其他AI的决策量化值, 并与之前的比较, 累计差值最作为机会成本.

结语

写AI是一件很有趣的事情, 尤其是当你观察到AI做出一个你认为还算'聪明'的决策的时候.