所以,我一直在玩minmax树,在一个双人棋盘游戏中创造一个简单的电脑玩家。我理解算法的基础知识,但是有一种情况可以避免我的火鸡注入大脑...当MIN可以分两步获胜时会发生什么?
例如,假设一个connect4 / tic-tac-toe类型的游戏,其中只有两个玩家中的一个可以拥有一个正方形。我如何让MAX占据一个正方形,仅仅是为了防止MIN进入正方形?
让我们尝试一个简化的例子(以漂亮的ASCII艺术显示),其中选项是左和右。假设树太大而不能一直遍历到终端状态,因此基于启发式函数计算中间值(用*标记为*)。 -INF是MIN获胜的终端状态。
MAX (a)
/ \
A B
/ \
MIN (b) MIN (c)
/ \ / \
A B A B
/ | | \
-INF *5 *22 *20
MIN将在状态(b)中选择动作A,得分为-INF
MIN将在状态(c)中选择动作B,得分为+20
MAX将在状态(a)中选择动作B,得分为+20左
问题 - 当然 - 如果MAX选择B然后MIN将执行动作A(因为该方格仍然可用),因此MIN将获胜。我需要让MAX实现在状态(a)中选择动作A的值,以防止MIN在下一步中获得-INF。
我会在代码中放入一堆测试来检查MIN是否可以获胜,但在我看来算法应该处理这个问题。我认为我在确定与MAX有关的价值方面错过了一个因素。
(编辑澄清)
答案 0 :(得分:3)
minimax树中的每个节点都是完整的游戏状态。当玩家选择一个动作时,游戏会移动到该状态,限制两个玩家的动作(无法从另一个分支中选择另一个动作)。所以在你的例子中,如果处于状态(a)玩家Max选择动作B,则游戏现在处于状态C.此时最小玩家的唯一两个选择是A(22)和B(20)。树的深度无关紧要;最大和最小的玩家将始终从当前的游戏状态中选择最佳动作。
对于井字游戏,每个州都需要成为一个完整的板块(当然可行)。例如,第一级将是X可以放置其标记的每个可能位置。那么这些州的每个孩子都将是O可以放置的每个可能的地方,给定父州(放置X的地方)等等。
当您无法表示整个游戏树(例如国际象棋)时,启发式方法很有用,但不会更改最小极大树的使用方式。
答案 1 :(得分:0)
如果认为问题与启发式功能有关。如你所说,如果MAX在状态(a)中选择B,
MIN将执行动作A(因为该方格仍然可用),因此MIN将赢得
但是在树上你用* 22标记它而不是-Inf它应该是(MIN获胜)。