如何为遗传算法的棋盘游戏策略选择一个好的表示



在我的学士论文中,我想写一个遗传算法,学习玩Stratego游戏(如果你不知道这个游戏,可能可以放心地假设我说的是国际象棋)。我以前从未做过真正的人工智能项目,所以看到我对实现事物的了解是如此之少,我大开眼界。

我一直在为一个实际的战略想出一个好的代表。我可能犯了一些思考错误,但我遇到了一些问题:

  • 我不认为你会有一个包含很多董事会职位之间的转换,因为这只是对吧
  • 决策树的分支会是什么样子喜欢我想出的任何表示都不能互换分支。。。如果我使用一个位字符串,它显然也是common,这些位代表什么
  • 我会给某些片段之间的距离打分吗?我将如何代表这一点

经过三年多的学习,我想我应该知道这些事情,所以我觉得自己很愚蠢——这看起来一定是我一点都不知道。尽管如此,任何关于谷歌的帮助或提示都将不胜感激!

我认为,您可以定义一个决策模型,然后尝试优化该模型的参数。您还可以创建多阶段决策模型。我曾经做过类似的事情来解决动态拨号乘车问题(本文),将其建模为两阶段线性决策问题。举个例子,你可以:

  1. 根据你的每个数字,决定下一个要移动的数字。每个图形的特征都来自于其在棋盘上的位置,例如得分能力、危险性、保护x个其他图形等。这些特征中的每一个都可以组合(例如,在线性模型中,通过神经网络,通过符号表达树、决策树等),并为您提供下一步行动的图形的排名。

  2. 按照您选择的人物表演。同样,可以采取一定数量的行动,每个行动都有特定的功能。同样,您可以将它们组合并排序,其中一个操作将具有最高优先级。这是您选择执行的操作。

你提取的特征可能非常简单,也可能非常复杂,这取决于你认为什么最有效,什么需要多长时间才能计算。

为了评估和提高决策模型的质量,您可以在与对手的几场比赛中模拟这些决策,并训练模型的参数,结合这些特征对动作进行排名(例如使用GA)。通过这种方式,您可以调整模型,以在与指定对手的比赛中赢得尽可能多的比赛。你可以通过与从未见过的对手比赛来测试该模型的通用性。

正如Mathew Hall刚才所说,你可以使用GP(如果你的模型是一个复杂的规则),但这只是一种模型。在我的情况下,重量的线性组合做得很好。

顺便说一句,如果你感兴趣的话,我们还有一个启发式优化软件,它可以为你提供GA、GP等等。它被称为启发式实验室。它是GPL和开源的,但附带了GUI(Windows)。我们有一些关于如何评估外部程序中的适应度函数(使用协议缓冲区进行数据交换)的方法,因此您可以处理模拟和决策模型,并让HeuristLab中的算法优化您的参数。

Vincent,

首先,不要觉得自己很愚蠢。你已经(我推断)学习基础计算机科学三年了;现在,你正在将这些基本技术应用于一些非常专业的东西——一个狭窄领域(人工智能)中的特定应用程序(Stratego)

其次,确保您的顾问完全了解Stratego的规则。纵横棋是在一个更大的棋盘上进行的,比国际象棋有更多的棋子(和更多类型的棋子)。这给了它更大的法律立场空间,也给了它大得多的法律行动空间。这也是一个隐藏信息的游戏,再次增加了难度。你的顾问可能想限制项目的范围,例如,集中精力观察一个变体。我不知道你为什么认为这更简单,除了棋子的动作更简单一点。

第三,我认为首先应该看看人工智能领域的游戏是如何处理的。Russell和Norvig,第3章(一般背景)和第5章(双人游戏)都很容易理解,写得很好。你会看到两个基本的想法:第一,你基本上是在一棵树上进行大规模搜索,寻找胜利;第二,对于任何非琐碎的游戏,树都太大了,所以你搜索到一定的深度,然后用"棋盘评估函数"逃避,寻找其中之一。我认为你的第三个要点是这样的。

董事会评估函数很神奇,可能是使用遗传算法或遗传程序的好候选者,这两种方法都可以与神经网络结合使用。其基本思想是,您正在尝试设计(或发展)一个函数,该函数以一个板位置作为输入,并输出一个数字。大数字代表强势,小数字代表弱势。Chellapilla和Fogel的一篇著名论文展示了如何在跳棋游戏中做到这一点:

http://library.natural-selection.com/Library/1999/Evolving_NN_Checkers.pdf

我认为这是一篇伟大的论文,将人工智能的三大分支联系在一起:对抗性搜索、遗传算法和神经网络。它应该给你一些关于如何代表董事会、如何思考董事会评估等方面的灵感。

不过,请注意,你试图做的事情比Chellapilla和Fogel的工作要复杂得多。没关系——毕竟13年后了,你会在这方面呆一段时间。你仍然会在代表棋盘时遇到问题,因为人工智能玩家对对手的状态了解不完全;最初,除了位置之外什么都不知道,但最终当冲突中的片段被消除时,人们可以开始使用一阶逻辑或相关技术来缩小单个片段,甚至可能使用概率方法来推断关于整个集合的信息。(其中一些可能超出了本科生项目的范围。)

您在为实际策略提供表示时遇到问题,这并不奇怪。事实上,我认为这是你所尝试的最具挑战性的部分。不幸的是,我没有听说过Stratego,所以我有点懒,我想你说的是国际象棋。

问题是国际象棋策略是一件相当复杂的事情。你在你的答案中建议包含GA中棋盘位置之间的大量转换,但棋盘的可能位置比宇宙中原子的数量更多,这显然不会很好地发挥作用。你可能需要做的是在GA中编码一系列权重/参数,这些权重/参数附着在占据棋盘位置并发起移动的东西上,我相信这就是你在第二个建议中暗示的。

可能最简单的建议是使用某种通用函数近似,比如神经网络;感知器或径向基函数是两种可能性。您可以将各种节点的权重编码到GA中,尽管还有其他相当合理的方法来训练神经网络,请参见反向传播。你也许可以对网络结构进行编码,这也有一个优点,我敢肯定,在用遗传算法开发神经网络方面已经做了相当多的研究,这样你就不会完全从头开始。

你仍然需要想出如何将棋盘呈现给神经网络,并解释其结果。尤其是在下棋时,你必须注意,很多动作都是非法的。如果你能对董事会进行编码并解释结果,从而只提出合法的行动,那将是非常有益的。我建议实施该系统的机制,然后使用不同的董事会代表,看看什么能产生好的结果。一些最重要的想法可以让你开始,尽管我真的不相信其中任何一个是特别好的方法:

  • 一个位串,所有64个正方形一个接一个,其中一个数字表示每个正方形中存在的内容。最明显的是,这可能是一个相当糟糕的表现,因为需要做大量的工作来过滤非法行为
  • 一个位串,所有64个正方形一个接一个,数字表示可以移动到每个正方形的内容。这具有体现国际象棋覆盖概念的优势,即你可以用你的棋子获得尽可能多的棋盘覆盖,但在非法移动和处理友敌棋子方面仍然存在问题
  • 一个比特串,所有32个比特一个接一个,数字表示该比特在每个正方形中的位置

总的来说,尽管我认为国际象棋一开始是一个相当复杂的游戏,但我认为很难让一些东西达到明显比随机更好的标准。我不知道Stratego是否更简单,但我强烈建议你选择一个相当简单的游戏。这将使您专注于正确实现的机制和游戏状态的表示。

不管怎样,希望这对你有帮助。

编辑:作为一个快速补充,值得研究标准国际象棋人工智能的工作原理,我相信大多数人都使用某种Minimax系统。

当你说"战术"时,你的意思是你希望GA给你一个玩游戏的通用算法(即进化AI),还是你希望游戏使用GA来搜索可能的移动空间,以便在每个回合生成一个移动?

如果你想做前者,那么考虑使用遗传编程(GP)。你可以试着用它来为固定的树大小产生最好的人工智能。JGAP已经为GP提供了支持。请参阅JGAP Robocode示例以获取此示例。这种方法确实意味着你需要一种用于Stratego AI的特定领域语言,所以你需要仔细思考如何向它展示棋盘和棋子。

使用GP意味着你的健身功能可以是人工智能在固定数量的预编程游戏中的表现,但这需要一个好的人工智能玩家(或一个非常有耐心的人)。

@DonAndre的答案对于运动来说是绝对正确的。一般来说,涉及基于状态的决策的问题很难用GA建模,需要某种形式的GP(要么是显式的,要么是@DonAndre建议的,本质上是声明性程序的树)。

在我看来,一个普通的战略玩家似乎很有挑战性,但如果你有一个合理的战略游戏程序,"设置战略棋盘"将是一个很好的GA问题。你作品的初始位置将是表型,外部Stratego游戏代码的结果将是适合度。直觉上,随机设置与有一些"好主意"的设置相比可能会处于不利地位,而小的"好想法"可以组合成越来越合适的设置。

关于什么是决策树的一般问题,即使试图想出一个简单的例子,我也发现很难想出一个足够小的例子,但也许在你评估是否攻击同一个排名的片段的情况下(IIRC会摧毁你和另一个片段?):

double locationNeed = aVeryComplexDecisionTree();
if(thatRank == thisRank){
   double sacrificeWillingness = SACRIFICE_GENETIC_BASE; //Assume range 0.0 - 1.0
   double sacrificeNeed = anotherComplexTree(); //0.0 - 1.0
   double sacrificeInContext = sacrificeNeed * SACRIFICE_NEED_GENETIC_DISCOUNT; //0.0 - 1.0  
   if(sacrificeInContext > sacrificeNeed){
      ...OK, this piece is "willing" to sacrifice itself

无论如何,基本的想法是,你仍然有很多策略游戏的编码,你只是在寻找可以插入会改变结果的参数的地方。在这里,我有一个牺牲自己的"基本"倾向(在普通作品中可能更高)和一个"折扣"基因决定的参数,该参数将衡量作品是否"接受或拒绝"牺牲的必要性。

相关内容

最新更新