2 回答
TA贡献1807条经验 获得超9个赞
处理第一个可用移动选择问题的一种简单方法是在迭代之前对有效移动进行排序。考虑您在问题中描述的立场:
X . . . X . X O O
这里O
是移动。在以默认方式(从左到右从上到下)迭代棋盘之前,((0, 1), (0, 2), (1, 0), (1, 2))
根据每个移动的好坏对四个有效移动的向量进行排序。做到这一点的一种方法是使用评估功能,该功能将计算在采取潜在行动后每一方有多少威胁。棋子的威胁P
(可以是X
或O
)是一行、一列或对角线,其中有一个空方格和两个P
方格(因此P
距离成为获胜线还差一个方格)。让我们看看对于给定位置的四个有效移动中的每一个,这个 eval 函数会告诉我们什么。我们计算两块威胁的数量,并分配S
等于差异的值O_threats - X_threats
。
如果O
采取(0, 1)
行动,则O_threats = 0
,X_threats = 2
,所以得分S = 0 - 2 = -2
。
如果O
采取(0, 2)
行动,则O_threats = 1
,X_threats = 1
,所以得分S = 1 - 1 = 0
。
如果O
采取(1, 0)
行动,则O_threats = 0
,X_threats = 1
,所以得分S = 0 - 1 = -1
。
如果O
采取(1, 2)
行动,则O_threats = 1
,X_threats = 2
,所以得分S = 1 - 2 = -1
。
根据计算的分数,访问有效动作的顺序应如下:(0, 2), (1, 0), (1, 2), (0, 1)
. 我们知道,鉴于完美的发挥,所有四个动作都是失败的动作。并且由于它们的分数相等(与损失值相同-10
),第一个考虑的移动(0, 2)
不会被下一个覆盖。这将使程序的移动“更加智能”,因为它现在尊重由移动创建/阻止的威胁(并且人类在玩井字棋时经常使用威胁考虑)。您可以通过使用不同的评估函数对有效动作进行排序来强制访问有效动作的不同顺序。
另请注意,当与 alpha-beta 修剪结合使用时,移动排序对于增加搜索深度非常有用,因为它允许首先考虑好的有效移动并增加修剪更多节点的机会。尽管 alpha-beta 修剪对于这样一个简单的游戏来说可能是一种矫枉过正,但它对于更复杂的游戏确实很有用。
TA贡献2065条经验 获得超14个赞
这是一种方法。
如果多个可能的移动之间存在平局,请计算expectimax,即与随机游戏的对手相比,为您提供最高可能分数的移动。
这将导致您阻止其中一种获胜方式,希望另一种方式看不到最佳可用棋步。
添加回答
举报