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

Artificial intelligence 如何为遗传算法的棋盘游戏策略选择一个好的表示?,artificial-intelligence,genetic-algorithm,data-representation,Artificial Intelligence,Genetic Algorithm,Data Representation,在我的学士学位论文中,我想写一个遗传算法来学习如何玩Stratego游戏(如果你不知道这个游戏,可以假设我说的是国际象棋)。我以前从来没有做过真正的人工智能项目,所以我对实现这些东西所知甚少,这让我大开眼界 我一直坚持的是为一个实际的战略提出一个很好的表达。我可能犯了一些思考错误,但我遇到了一些问题: 我不认为你会有一个包含很多 董事会职位之间的转换,因为这只是 残忍地折磨它,对吗 决策树的分支看起来像什么 喜欢我提出的任何表述都没有可互换性 分支机构。。。如果我使用一个位字符串,它显然也是

在我的学士学位论文中,我想写一个遗传算法来学习如何玩Stratego游戏(如果你不知道这个游戏,可以假设我说的是国际象棋)。我以前从来没有做过真正的人工智能项目,所以我对实现这些东西所知甚少,这让我大开眼界

我一直坚持的是为一个实际的战略提出一个很好的表达。我可能犯了一些思考错误,但我遇到了一些问题:

  • 我不认为你会有一个包含很多 董事会职位之间的转换,因为这只是 残忍地折磨它,对吗
  • 决策树的分支看起来像什么 喜欢我提出的任何表述都没有可互换性 分支机构。。。如果我使用一个位字符串,它显然也是 通常,位代表什么
  • 我是否为某些片段之间的距离分配分数?我将如何陈述这一点

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

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

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

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

您仍然需要想出如何向神经网络展示电路板并解释其结果。尤其是在下棋时,你必须注意很多棋步都是非法的。如果你能对董事会进行编码并解释结果,这样就只会出现合法的变动,这将是非常有益的。我建议实施该系统的机制,然后与不同的董事会代表玩一玩,看看什么能带来好的结果。一些让你开始的最重要的想法可能是,尽管我并不确信其中任何一个是特别好的方法:

  • 一种位字符串,包含一个接一个的所有64个方格,数字表示每个方格中的内容。最明显的,但可能是一个相当糟糕的表现,因为需要大量工作来过滤非法移动
  • 一种位字符串,包含一个接一个的所有64个方格,数字表示每个方格可以移动的内容。这具有体现国际象棋覆盖概念的优势,在国际象棋中,你需要尽可能多地使用棋子覆盖棋盘,但仍然存在非法移动和处理友方/敌方棋子的问题
  • 一种位字符串,包含一个接一个的所有32个片段,数字表示该片段在每个方块中的位置
总的来说,虽然我认为国际象棋一开始是一个相当复杂的游戏,但我认为很难让它达到比随机更好的标准。我不知道Stratego是否更简单,但我强烈建议你选择一款相当简单的游戏。这将使您专注于获得正确的实现机制和游戏状态的表示

无论如何,希望这对你有所帮助

编辑:作为一个快速补充,值得研究一下标准国际象棋AI是如何工作的,我相信大多数人都会使用某种方式。

当你说“战术”时,你的意思是你想让GA给你一个玩游戏的通用算法(即进化AI)或者你想让游戏使用GA搜索可能的移动空间,以在每个回合生成一个移动

如果你想做前者,那就考虑使用遗传编程(GP)。您可以尝试使用它为固定的树大小生成最好的AI。已经提供了对GP的支持。有关此示例,请参见。这种方法确实意味着您需要一种特定于领域的语言来实现Stratego AI,因此您需要仔细考虑如何向其公开电路板和部件


使用GP意味着你的适应度函数可以是AI在固定数量的预编程游戏中的表现,但这需要一个好的AI玩家(或者一个非常耐心的人)开始。我认为,你可以定义一个决策模型,然后尝试优化该模型的参数。您还可以创建多阶段决策模型。我曾经做过类似的事情来解决动态拨号搭车问题(),将其建模为两阶段线性决策问题。举个例子,您可以:

  • 对于每个数字,决定下一个移动哪个。每个图形的特征是其在板上的位置衍生的某些特征,例如得分能力、危险、保护x或其他fi
    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