所以我被分配了使用遗传算法编写5x5x5井字游戏的问题。我的方法是从3x3开始,使其工作,然后扩展到5x5,然后扩展到5x5x5。
它的工作方式是:
模拟一大堆游戏,并在每个游戏的每个回合中,在相应的表格(X表格或O表格实现为c ++ stdlib地图)中查找响应。如果电路板不存在,请将电路板添加到表中。否则,进行随机响应。
在我完成表格之后,我初始化了一堆玩家(每个玩家都有一个董事会表格的副本,用随机回复进行初始化),让他们互相对抗。
对于3x3,折扣董事会是其他董事会的反思/轮换,董事会的举动是“取胜”或“阻止胜利”,我将遇到的董事会总数为53或38,取决于你是第一还是第二。太棒了!在一小时内生成了最佳玩家。很酷!
对5x5使用相同的策略,我知道表的大小会增加,但没有意识到它会大幅增加。即使折扣旋转/反射和强制移动,我的表格约为360万条,看不到尽头。
好的,这显然不会起作用,我需要一个新的计划。如果我不列举所有电路板,只是一些电路板,该怎么办?好吧,看起来这也不会起作用,因为如果每个玩家只有一小部分他们可能看到的可能的板,那么他们将会做出很多随机动作,显然是在最优化的相反方向。 / p>
解决这个问题的现实方法是什么?我会被困在使用电路板功能吗?目标是尽可能少地编写游戏功能。
我一直在做研究,但我读到的所有内容都会导致最小/最大的A-B修剪作为唯一可行的选择。我当然可以这样做,但GA非常酷,我现在的方法只是在这里超过现实。
编辑问题已经解决了:
使用结合开放空间的汉明距离的相似性函数,可能的胜利条件以及一些其他措施使得表格降低到可管理的2500种可能性,std::map
处理的只有一小部分第二。
答案 0 :(得分:3)
我对GA的了解非常有限,但在建模板配置中,你不是在问错误的问题吗?您的任务不是枚举所有可能的获胜配置 - 您要做的是找到导致获胜配置的一系列移动。也许您应该关注的人群不是一组董事会,而是一组移动序列。
编辑:从空板开始,我并没有考虑从特定的电路板开始。在3x3电路板上显而易见的是,以(1,1)开始的移动序列最适合X.重要的不是最终电路板中间有一个X,而是X放在中间第一。如果X有一个或多个最佳的第一步,也许X也有最好的第二,第三或第四步?经过几轮健身测试和重组后,我们会发现X的第二步通常是相同的,还是一小部分值?那么第三步呢?
这不是极小极大,因为你不是根据董事会的先前状态一次一个地寻找最佳动作,你正在寻找同时所有最佳动作,希望收敛于制胜战略。
我知道这并不能解决你的问题,但如果你想要制定一个成功的策略,那么看起来很自然,你需要看看一系列动作而不是董事会状态。
答案 1 :(得分:0)
这似乎是很老的话题,但引起了我的注意。认为这可能有助于公众讨论,这是我的意见。
我认为您需要更加明确地定义任务的目标:
您是否要寻找一组获胜的棋盘?我不这么认为,因为这对于3x3的电路板来说非常有用,甚至可以手动解决,并且可以外推到更大的电路板上。遗传算法可用于较大的董事会,但这仅是遗传算法。
您是否要利用GA向AI玩家训练TicTacToe?我认为应该是这样。在这种情况下,您的GA字符串/染色体不应代表获胜板,而应代表获胜游戏的玩家有序移动顺序。正如预期的那样,建模起来确实有点棘手,这将是一次真正的AI培训编程练习。
我希望这种观点会有所帮助。