我认为极小极大不是点盒算法的最佳选择。关于这个游戏的完整故事你真的需要阅读这本书The Dots and Boxes Game: Sophisticated Child's Play by Elwyn R. Berlekamp,但我会在这里给你一个简短的总结。
Berlekamp 提出了许多有力的意见。第一个是双交叉策略,我假设你知道(在Wikipedia page on the game 中有描述)。
第二个是长链奇偶校验规则。这源于大多数出色游戏的三个事实:
- 长链将在游戏结束时上演。
- 除最后一条外,每条链中都会有一个双叉。
- 首先必须参与任何长链的玩家将输掉游戏。
加上你开始的点数加上双叉的数量等于游戏中的回合数的限制。所以如果开始有十六个点,并且有一个双十字,那么就会有十七个回合。 (在大多数游戏中,这意味着第一个玩家将获胜。)
这极大地简化了对游戏中期位置的分析。例如,考虑这个有 16 个点和 11 步棋的局面(Berlekamp 书中的问题 3.3)。这里最好的做法是什么?
好吧,如果有两条长链,就会有一个双叉,游戏将在另外六步后结束(16 + 1 = 11 + 6),走棋的玩家会输。但如果只有一条长链,就不会出现双叉,游戏将在另外五步(16 + 0 = 11 + 5)后结束,走棋的玩家获胜。那么玩家移动如何保证只有一条长链呢?唯一获胜的举动牺牲了两个盒子:
Minimax 会发现这个动作,但需要做更多的工作。
第三个也是最有力的观察是点和框是impartial game:无论轮到谁玩,以及在游戏过程中出现的典型位置(即,那些包含 长链 的盒子)它也是normal game:最后移动的玩家获胜。这些属性的组合意味着可以使用Sprague–Grundy theory 静态分析位置。
这是一个使用 Berlekamp 书中的图 25 来说明这种方法的强大功能的示例。
在这个位置有 33 种可能的走法,一个玩得好的游戏会持续大约 20 多步,所以如果极小极大在合理的时间内完成分析是可行的,我会感到惊讶。但是该位置有一个长链(上半部分的六个正方形链),因此可以对其进行静态分析。该位置分为三块,其值为nimbers:
可以通过动态规划在 O(2n) 时间内计算剩余 n 步的位置,您将无论如何,可能想要缓存许多常见小位置的结果。
Nimbers 使用异或相加:*1 + *4 + *2 = *7。因此,唯一获胜的举动(将 nim-sum 减少到 *0 的举动)是将 *4 更改为 *3(因此头寸总和为 *1 + *3 + *2 = *0)。三个红色虚线中的任何一个都获胜:
编辑补充:我知道这个总结并没有真正构成一个算法,并且留下了很多没有答案的问题。对于一些答案,您可以阅读 Berlekamp 的书。但在开局时有一点差距:链数和斯普拉格-格兰迪理论实际上只在中局和残局中实用。对于开幕式,你需要尝试一些新的东西:如果是我,我会很想尝试Monte Carlo tree search,直到可以数出链条。这种技术为围棋游戏创造了奇迹,在这里也可能很有成效。