Tic-Tac-Toe的遗传算法

时间:2011-04-11 19:56:42

标签: artificial-intelligence genetic-algorithm

所以我被分配了使用遗传算法编写5x5x5井字游戏的问题。我的方法是从3x3开始,使其工作,然后扩展到5x5,然后扩展到5x5x5。

它的工作方式是:

  • 模拟一大堆游戏,并在每个游戏的每个回合中,在相应的表格(X表格或O表格实现为c ++ stdlib地图)中查找响应。如果电路板不存在,请将电路板添加到表中。否则,进行随机响应。

  • 在我完成表格之后,我初始化了一堆玩家(每个玩家都有一个董事会表格的副本,用随机回复进行初始化),让他们互相对抗。

  • 使用他们的胜利/损失来评估健康状况,我保持一定的最佳百分比,然后继续前进。冲洗并重复X代,最佳选手应该出现。

对于3x3,折扣董事会是其他董事会的反思/轮换,董事会的举动是“取胜”或“阻止胜利”,我将遇到的董事会总数为53或38,取决于你是第一还是第二。太棒了!在一小时内生成了最佳玩家。很酷!

对5x5使用相同的策略,我知道表的大小会增加,但没有意识到它会大幅增加。即使折扣旋转/反射和强制移动,我的表格约为360万条,看不到尽头。

好的,这显然不会起作用,我需要一个新的计划。如果我不列举所有电路板,只是一些电路板,该怎么办?好吧,看起来这也不会起作用,因为如果每个玩家只有一小部分他们可能看到的可能的板,那么他们将会做出很多随机动作,显然是在最优化的相反方向。 / p>

解决这个问题的现实方法是什么?我会被困在使用电路板功能吗?目标是尽可能少地编写游戏功能。

我一直在做研究,但我读到的所有内容都会导致最小/最大的A-B修剪作为唯一可行的选择。我当然可以这样做,但GA非常酷,我现在的方法只是在这里超过现实。

编辑问题已经解决了:

使用结合开放空间的汉明距离的相似性函数,可能的胜利条件以及一些其他措施使得表格降低到可管理的2500种可能性,std::map处理的只有一小部分第二。

2 个答案:

答案 0 :(得分:3)

我对GA的了解非常有限,但在建模板配置中,你不是在问错误的问题吗?您的任务不是枚举所有可能的获胜配置 - 您要做的是找到导致获胜配置的一系列移动。也许您应该关注的人群不是一组董事会,而是一组移动序列。

编辑:从空板开始,我并没有考虑从特定的电路板开始。在3x3电路板上显而易见的是,以(1,1)开始的移动序列最适合X.重要的不是最终电路板中间有一个X,而是X放在中间第一。如果X有一个或多个最佳的第一步,也许X也有最好的第二,第三或第四步?经过几轮健身测试和重组后,我们会发现X的第二步通常是相同的,还是一小部分值?那么第三步呢?

这不是极小极大,因为你不是根据董事会的先前状态一次一个地寻找最佳动作,你正在寻找同时所有最佳动作,希望收敛于制胜战略。

我知道这并不能解决你的问题,但如果你想要制定一个成功的策略,那么看起来很自然,你需要看看一系列动作而不是董事会状态。

答案 1 :(得分:0)

这似乎是很老的话题,但引起了我的注意。认为这可能有助于公众讨论,这是我的意见。

我认为您需要更加明确地定义任务的目标:

  1. 您是否要寻找一组获胜的棋盘?我不这么认为,因为这对于3x3的电路板来说非常有用,甚至可以手动解决,并且可以外推到更大的电路板上。遗传算法可用于较大的董事会,但这仅是遗传算法。

  2. 您是否要利用GA向AI玩家训练TicTacToe?我认为应该是这样。在这种情况下,您的GA字符串/染色体不应代表获胜板,而应代表获胜游戏的玩家有序移动顺序。正如预期的那样,建模起来确实有点棘手,这将是一次真正的AI培训编程练习。

我希望这种观点会有所帮助。