题目
利用MinMax算法预测三子棋盘中下一步X的落子位置,使得执X的棋手必定能获胜。
求解思路
给定某个棋盘状态,当前X行棋,随后O行棋。该棋盘状态为博弈树的根结点,以下一步行棋产生的局面为子结点。通过递归建立博弈树,通过博弈树深度的奇偶性来判断X行棋还是O行棋,然后递归建立博弈树。
建树完毕后,通过实现MinMax算法,计算博弈树中各个节点的效用值。对于根节点来说,效用值为+1,表示X有必胜策略,该策略的下一步行动为子结点效用值为+1的下一步落子,此时我们就找到了解。
在这里有几个主要的函数,他们
在 buildTree 中,以递归的方式创建一棵博弈树,初始传入参数为博弈树的根结点;
在 minmax 中,完成 MinMax 算法主体部分,初始传入参数为博弈树的根结点,返回下一步 X 棋子落位后的棋盘状态(特别的,该棋子落位情况使得执 X 棋子的选手必定能获得胜利)。另外,可能有多个解,所以将所有解存入列表并作为函数返回值,无解则是返回一个空列表。
在 max_value 中,计算该博弈树结点的子结点中的最大的评估值,并返回;
在 min_value 中,计算该博弈树结点的子结点中的最小的评估值,并返回;
在 get_value 中,计算最终棋盘状态执 X 棋子的评估值并返回( 1 表示胜利,-1 表示失败,0 表示平局);
在 isTerminal 中,判断该博弈树结点的棋盘状态是否为最终棋盘状态,即无空位可以下棋子(或该博弈树结点无子结点)。
实现代码
1 | # -*- coding:utf-8 -*- |