Game Draught(Chekers)的最佳人工智能方法



目前我正在Eralang实现一个草稿在线游戏服务器。(一款手机游戏)。我对人工智能方法有一个问题。(无论是minmax方法、遗传算法还是任何其他方法)。在定义适当的启发式函数时也有问题。基本上,我需要的是一个想法,如何在考虑语言、有限的资源数量和服务器响应时间(超时)的同时开始实现,因为这是一个在线移动游戏。

需要一些关于算法和启发式函数的想法

正如我的人工智能教授常说的那样:在游戏AI中,程序性能的主要差异是细节,而不是所使用的算法。这种棋盘游戏使用的算法通常有20-30行长,人工智能引擎的强弱在于开发者通过游戏细节挖掘来减少搜索空间的能力。只有对特定游戏有很好的了解,才能有效地做到这一点。

Checkers有一个中等的搜索空间(事实上它已经完全解决了),但这是从棋盘游戏ai编程开始的一个很好的起点。出于这个原因,我建议您从经典的alpha-beta修剪算法开始。

但是,正如我之前所说,选择算法只是工作的10%。细节要重要得多,所以让我们来看看它们:

  • 启发式函数:这是一个关键点。启发式函数必须是:快速、简单地计算和描述给定状态的值。通常,启发式函数只是一组特征的加权和。在这篇文章中,你可以找到一个简单的启发式函数(加上一种遗传方法来调整它),它使用了碎片数量、国王数量和机动性值(每个玩家的合法移动次数)等特征。另一个提示:启发式函数应该返回整数值:只为0.0003的差值选择分支是愚蠢的,所以最好将启发式函数四舍五入为整数值。

  • 利用对称性:如果你能在棋盘位置找到对称性,必须将其考虑在内!跳棋没有太多的对称性,但我认为你仍然可以做一些事情。

  • 预计算:这就是解决跳棋的方法。:)但很明显,你不必把所有东西都储存起来。国际象棋AI通常有一个开局库和一个结束游戏的库。这些是预先计算的操作(或基于规则的操作),允许您的软件在开始和结束阶段避免大量计算。

  • 探索轻松(作弊)问题:这是一个对我帮助很大的技巧。例如,你可以假设你可以连续做两个动作,而你的对手什么都不做。如果你不能达到一个好的位置作弊,那么你就不能在正常的比赛中(与试图对抗你的对手)达到一个良好的位置,你可以简单地放弃这条路。

这只是我可以为你解决这个问题的一些小建议。我不能完整,因为这是一个很大的领域,但我希望你已经明白了。你会通过经验找到新的更好的想法。:)

对于与时间相关的问题:有时间限制的人工智能引擎使用迭代深化版本的阿尔法-贝塔修剪算法(本文中有详细信息和进一步的材料)。这种方法有两个主要优点:可以随时停止计算,也可以在下一次迭代中使用前一次迭代来改进搜索启发式。此外,如果你必须重新启动搜索几次,这肯定优于传统的阿尔法-贝塔修剪算法。

我希望你能觉得这个有用。

相关内容

最新更新