我需要创建一个AI来与其他AI竞争。
两个AI将运行在相同的硬件上,拥有相同的时间和内存资源。我知道对手AI将使用带有alpha-beta剪枝的极小极大算法。
我的问题是 – 有什么方法可以击败这样的对手?如果我自己使用极小极大算法 – 那么两个AI都能完美预测对方的行动,游戏的结果将基于游戏的固有属性(如先手必胜等)。
显然的解决方案是设法看到更多可能的走法,这将允许更好的评估 – 由于处理器时间相同,我无法进行更深层次的评估(假设对手的AI代码同样优化)。我可以使用预计算的树来获得额外的优势,但没有超级计算机,我肯定无法“解决”任何非平凡的游戏。
故意选择一个非最优节点,比如alpha-beta会剪枝的节点,这样做是否有价值?这可能会对对手造成CPU时间上的惩罚,因为他们不得不返回并重新评估树。这对我来说也是一种惩罚,因为我必须评估极小极大树+alpha-beta来查看alpha-beta会剪枝哪些节点,而不会直接获得任何好处。
还有哪些其他策略可以针对这样的对手进行优化?
回答:
首先,故意选择非最优路线是没有价值的。假设你的对手会以最优方式进行比赛(这是极小极大搜索的基本假设),你的对手会利用你的错误进行反击。一个好的游戏引擎会有一个哈希反驳表条目,包含针对你的失误的反击棋,所以你通过做出冒险的举动不会节省时间。做出坏的举动只会让电脑对手更快地找到好的举动。
对于像奥赛罗这样的游戏,关键是要认识到,直到游戏后期你才能确定什么是最优的走法。这是因为搜索树几乎总是太大,无法穷尽地搜索所有赢或输的位置,因此极小极大算法无法确定哪些走法会导致胜利或失败。你只能启发式地决定在哪里停止搜索,任意将这些节点称为“终端”,然后运行一个评估函数来猜测一个位置的胜负潜力。
评估函数的任务是评估一个位置的价值,通常使用可以不进一步搜索游戏树就能计算的静态指标。棋子数量、位置特征、残局数据库,甚至对手的心理都可能在这里起作用。你在评估函数中投入的智能越多,通常你的引擎表现就越好。但静态评估的要点是替代那些过于昂贵的搜索。如果你的评估函数做得太多或效率太低,它可能会比获取相同信息所需的游戏树搜索更慢。知道在评估函数中放什么以及何时使用静态评估而不是搜索,是编写一个好游戏引擎的艺术的重要组成部分。