对于我的学士论文,我想写一个学习玩Stratego游戏的遗传算法(如果你不知道这个游戏,假设我说国际象棋可能是安全的)。我以前从未做过实际的人工智能项目,所以看到我实际上对实施的了解有多少,这是一个大开眼界。
我坚持的事情是为实际策略提供良好的代表性。我可能会犯一些思考错误,但我遇到了一些问题:
我认为经过三年多的学习后我应该知道这些事情,所以我觉得非常愚蠢 - 这一定看起来像我根本没有任何线索。不过,任何有关谷歌的帮助或提示都会受到赞赏!
答案 0 :(得分:5)
我认为,您可以定义决策模型,然后尝试优化该模型的参数。您也可以创建多阶段决策模型。我曾经做过类似的事情,通过将其建模为两阶段线性决策问题来解决动态拨号问题(paper here)。举个例子,你可以:
对于您的每个数字,决定下一步要移动哪一个。每个图的特征在于从其在板上的位置得到的某些特征,例如,能够得分,危险,保护x其他数字,等等。这些特征中的每一个都可以组合在一起(例如,在线性模型中,通过神经网络,通过符号表达式树,决策树......),并为您提供下一个行为的等级。
使用您选择的数字进行操作。同样,可以采取一定数量的行动,每个行动都有某些特征。您可以再次对它们进行组合和排名,并且一个操作将具有最高优先级。这是您选择执行的那个。
您提取的功能可能非常简单或非常复杂,它取决于您认为最有效的功能与计算时间长度的功能。
为了评估和改善决策模型的质量,您可以在针对对手的几个游戏中模拟这些决策,并训练组合这些特征的模型参数以对移动进行排名(例如使用GA)。通过这种方式,您可以调整模型以赢得尽可能多的游戏以对抗指定的对手。你可以通过对抗前所未见过的对手来测试该模型的一般性。
正如Mathew Hall所说,你可以使用GP(如果你的模型是一个复杂的规则),但这只是一种模型。在我的例子中,权重的线性组合非常好。
顺便说一下,如果你感兴趣我们还有一个启发式优化软件,它为你提供GA,GP和那些东西。它被称为HeuristicLab。它是GPL和开源,但附带一个GUI(Windows)。我们有一些关于如何评估外部程序中的适应度函数(使用协议缓冲区进行数据交换)的方法,因此您可以处理模拟和决策模型,并让HeuristicLab中的算法优化您的参数。
答案 1 :(得分:2)
你在提出实际策略的表示方面遇到问题的事实并不令人惊讶。事实上,我认为这是你所尝试的最具挑战性的部分。不幸的是,我还没有听说过Stratego所以有点懒,我会假设你下棋。
问题在于国际象棋战略相当复杂。你建议在你的答案中包含GA中板位之间的大量过渡,但是棋盘比宇宙中的原子数更多可能的位置,这显然不会很好地工作。您可能需要做的是在GA中编码一系列权重/参数,这些权重/参数附加到接收板位置并触发移动的东西上,我相信这是您在第二个建议中暗示的内容。 / p>
可能最简单的建议是使用某种通用函数逼近,如神经网络; Perceptrons或Radial Basis Functions是两种可能性。您可以将各种节点的权重编码到GA中,尽管还有其他相当合理的方法来训练神经网络,请参阅Backpropagation。您也许可以编码网络结构,这也有一个优点,我很确定已经用遗传算法开发神经网络进行了大量研究,因此您无法从头开始
您仍然需要想出如何将电路板呈现给神经网络并从中解释结果。特别是,有了国际象棋,你必须注意到许多动作都是非法的。如果您可以对电路板进行编码并解释结果以便仅显示合法移动,那将是非常有益的。我建议实现系统的机制,然后玩不同的板表示,看看有什么效果。尽管我并不确信其中任何一个都是特别好的方法,但是有一些想法可以帮助您入门。
总的来说,虽然我认为国际象棋起初是一个复杂的游戏,但我认为将标准游戏变得非常难以获得明显优于随机游戏的标准。我不知道Stratego是否更简单,但我强烈建议你选择一个相当简单的游戏。这将使您专注于使实现的机制正确并表示游戏状态。
无论如何希望对你有所帮助。
编辑:作为一个快速补充,值得研究标准象棋AI的工作方式,我相信大部分都使用某种Minimax system。
答案 2 :(得分:1)
当你说“战术”时,你的意思是你希望GA给你一个通用算法来玩游戏(即演化AI)或者你是否希望游戏使用GA来搜索可能移动的空间每回合产生一次移动?
如果你想做前者,那么请研究使用遗传编程(GP)。您可以尝试使用它来生成固定树大小的最佳AI。 JGAP已经为GP提供了支持。有关此实例,请参阅JGAP Robocode example。这种方法确实意味着您需要为Stratego AI提供特定于域的语言,因此您需要仔细考虑如何将电路板和电路板暴露给它。
使用GP意味着你的健身功能可以说是AI在固定数量的预编程游戏中的表现,但这需要一个优秀的AI玩家(或者非常耐心的人)。
答案 3 :(得分:0)
@ DonAndre的回答绝对正确。一般而言,涉及基于状态的决策的问题很难用GA进行建模,需要某种形式的GP(要么是显式的,要么是@DonAndre建议的,树本质上是声明性程序)。
一般的Stratego玩家在我看来相当具有挑战性,但如果你有一个合理的Stratego游戏计划,“设置你的Stratego董事会”将是一个很好的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
不管怎样,基本的想法是你仍然有很多Stratego-play的编码,你只是在寻找可以插入可能改变的参数的地方结果。在这里,我想到了一种“基础”倾向,以牺牲自己(可能在普通作品中更高)和“折扣”遗传决定的参数,这将决定该作品是否“接受或拒绝”牺牲的需要。