游戏草案(Checkers)的最佳人工智能方法

时间:2014-01-03 10:50:56

标签: erlang artificial-intelligence genetic-algorithm heuristics minmax

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

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

1 个答案:

答案 0 :(得分:1)

正如我的人工智能教授习惯说的那样:在游戏AI中,程序性能的主要区别在于细节,而不是使用的算法。用于这种棋盘游戏的算法通常为20-30行,使人工智能引擎强或弱的是开发人员通过游戏细节利用来减少搜索空间的能力。只有充分了解特定游戏,才能有效地完成这项工作。

Checkers拥有一个中等搜索空间(事实上它已经是completely solved),但它是一个很好的起点,从棋盘游戏开始编程。出于这个原因,我建议你从古典alpha-beta pruning algorithm开始。

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

  • 启发式功能:这是关键点。启发式函数必须:快速且易于计算并很好地描述给定状态的值。通常,启发式函数只是一组特征的加权和。在this article中,您可以找到一个简单的启发式函数(加上一种遗传方式来调整它),它使用诸如件数,国王数和移动性值(每个玩家的合法移动数)等特征。另一个提示:启发式函数应返回整数值:仅仅为0.0003差异而选择分支是愚蠢的,因此最好将启发式方法舍入为整数值。

  • 利用对称性:如果您可以在电路板位置找到对称性,必须将其考虑在内!在检查器中没有太多的对称性,但我认为你仍然可以做一些事情。

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

  • 探索轻松(受骗)的问题:这是一个巨大的提示,对我有很大帮助。例如,你可以假设你可以连续两次移动而你的对手什么都不做。如果你无法达到一个好的位置作弊,那么你就无法在正常游戏中找到一个好位置(试图反击你的对手)你可以简单地丢弃那条道路。

这只是我可以给你解决这个问题的一些小建议。我不能完整,因为它是一个非常大的领域,但我希望你有这个观点。您将通过经验找到新的更好的想法。 :)

对于与时间相关的问题:时间限制的AI引擎使用alpha-beta修剪算法的迭代深化版本(在this article中有详细信息和更多材料)。这种方法有两个主要优点:您可以随时停止计算,并且可以使用先前的迭代来改进下一个迭代中的搜索启发式。此外,如果您必须多次重新启动搜索,这绝对优于传统的alpha-beta修剪算法。

我希望你能发现这很有用。