编辑-这里是游戏规则,如果你不熟悉:https://en.wikipedia.org/wiki/Reversi#Rules
让我们假设黑色是第一个在标准的8x8棋盘上移动的人,在传统的逆转游戏开始配置中,每个玩家在棋盘中央放置2块牌。我们还知道两个玩家移动了相同数量的移动,(所以黑色是下一个移动的)
是否有可能找到一组有效的移动,会导致给定的板状态?(据了解,有多个移动可能导致给定的状态。只要移动是有效的,我不在乎)
所谓“板态”,我指的是板上瓷砖的排列。
我熟悉minmax算法(alpha剪枝),但我不确定它是否可以在这种情况下使用。
这是我脑子里想出来的:
如果您对黑色、白色、黑色等重复这些步骤,您将:
A.以起始位置结束。结果是一组满足原始板状态的有效移动。(您在步骤3中跟踪的移动)
B.如果棋盘有效,但下一个玩家没有移动,则当时可能没有有效的移动。该移动记录为0,并继续与前一个玩家一起前进。
C.无效的棋盘状态。删除之前记住的走法,恢复棋盘状态。使用同一个棋手,重新开始这个过程,寻找连续的一行牌。如果不存在其他行,撤消下一个记录的走法,并与另一个棋手重新开始。冲洗。重复,直到你到达A。
根据游戏的发展程度,这可能需要很长时间。我可能忽略了游戏的某些方面,这将使它更具挑战性。
这似乎比使用minmax等找到最佳移动要困难得多。
有人成功地以编程方式做到了这一点吗?这甚至可能是中后期游戏吗?
我还没有尝试在代码中做到这一点。我想先把我的头绕过去。
显而易见的答案是“是”:简单地用给定的石头数量(这是有限的)生成所有可能的游戏,并选择生成位置的游戏。
你可能的意思是:有没有算法在合理的时间内做到这一点?
我认为这个问题很有趣。大约20年前,当我看到一个字幕声称一边“明显”更好的位置时,我也有过同样的问题,当时我看起来正好相反。但是我当时的奥赛罗程序不允许设置任意的棋盘位置,它必须是一个有效的游戏序列。由于我不是专家玩家,我希望用那个程序来证明我的怀疑。
我的想法和你差不多:从一个给定的位置向后工作,直到到达起始位置。我不知道谁是最后一个移动的,这使得它更加困难,但原则上这是相同的问题。但是游戏不是很远,也许20步,所以我认为这应该是可行的。
我想在我放弃之前,我运行了我的程序几个小时,也许几天(我不太记得了)。组合爆炸比最初看起来要大。
在上面的步骤中,你似乎忽略了一件事:仅仅看线是不够的,你还必须看线的组合。举一个简单的例子,假设板的一部分看起来像这样:
O - - -
O - - -
O - - -
O O O O
这里O
表示白色石头,-
表示黑色石头或没有石头。一行四个白色石头意味着6种可能的翻转场景,有两条这样的线意味着12。到目前为止还不错。但是如果白色移动在左下角,我们还必须考虑可能的组合,这是4种额外的场景。在这个例子中听起来可能不多,但是如果你从有问题的石头中得到额外的线,比如对角线,组合的数量很快就会乘法。
因此,尽管逆向工作可能是最简单的方法,但我不认为这是一个非常实用的方法。当然,我20年前的程序可以改进,现在计算机也快得多,但我从这个实验中得出的结论是,这在原则上是一个有缺陷的方法。
相反,我现在建议从起始位置继续工作,并从给定位置使用一些不变量。也就是说,我们知道外部磁盘从未翻转,这可能足以控制搜索树,尽管我确信给定位置的石头数量仍然有一个实际的限制(但希望大于20)。我认为这是一个原因,通常合法移动的数量可能会在中间游戏中达到10个左右(并且可能会降低很多时间),而当回溯时,通常会有更多可能的场景。这听起来很像我最初的建议,简单地生成所有可能的游戏,但我在这里的观点是使用尽可能多的不变量。例如,它们不仅可以从外部石头中扣除,让我们假设从给定位置的以下切口:
X
X . . .
X X O O .
. . .
(这里的X
表示黑色或白色的石头,。
没有石头,空间可以是任何东西。)
右边的O石显然是怀特放的,但由此我们可以推断出另一个O石是布莱克放的,即使X允许其他场景在更早的位置。你甚至可以手动推断出这样的东西,然后在搜索中硬编码它们。
我觉得这方面一定已经有研究了,但我没能找到。