【发布时间】:2020-06-17 13:22:31
【问题描述】:
我正在开发一个实现 Donald Knuth 算法的策划游戏。前五个步骤很清楚。我必须为每个可能的答案创建一组排列,使用 1122 作为我的第一个猜测,将集合中的每个可能答案与 1122 进行比较,然后删除任何不返回与当前猜测相同反馈的可能答案。现在的问题在于确定下一个猜测以及我应该如何实现第 6 步。算法如下所示。
Mastermind-Five-Guess-Algorithm Donal Knuth 用于解决游戏 Mastermind 的五次猜测算法。
1977 年,Donald Knuth 证明密码破解器可以解决 五步或更少的模式,使用渐进式算法 减少了可能的模式数量。
算法的工作原理如下:
创建包含 1296 个可能代码的集合 S(1111、1112 ... 6665、6666)。
从最初的猜测 1122 开始(Knuth 给出的示例显示其他最初的猜测,例如 1123、1234 在五次尝试中都不会获胜 每个代码)。
猜猜得到彩色和白色钉子的答案。
如果响应是四个彩色钉子,则游戏获胜,算法终止。
否则,如果当前猜测是代码,则从 S 中删除任何不会给出相同响应的代码。
例如,如果 您当前的猜测是 1122 并且您得到 BW 的响应;
如果 代码是 1111,你会得到两个黑色钉子 (BB),猜测是 1122, 这与一黑钉和一白钉(BW)不同。所以, 从潜在解决方案列表中删除 1111。
F(1122,1112) = BBB≠BW →从 S 中删除 1112
F(1122,1113) = BB≠BW →从 S 中删除 1113
F(1122,1114) = BB≠BW →从 中删除 1114小号
F(1122,1314) = BW=BW → 将 1314 保留在 S应用 minimax 技术找到下一个猜测,如下所示:
对于每个可能的猜测,即 1296 的任何未使用代码,而不仅仅是 S 中的那些,计算 S 中有多少可能性会被消除 对于每个可能的彩色/白色挂钩分数。猜测的分数是 它可能从 S 中消除的最小可能性。
A 对于 1296 的每个未使用的代码,通过 S 的单循环将提供一个 每个可能的彩色/白色挂钩分数的“命中数”;创造 一组具有最小最大分数的猜测(因此是 minmax)。
来自 具有最小(最大)分数的一组猜测,选择一个作为 下一个猜测,尽可能选择 S 的成员。
Knuth 遵循选择数字最少的猜测的约定 价值例如2345低于3456。Knuth也举了个例子 表明在某些情况下,S 的任何成员都不会是最高的 得分猜测,因此猜测不能在下一回合获胜,然而 将有必要确保五场胜利。- 从第 3 步开始重复
Link to Wikipedia page
【问题讨论】:
-
第6点确实是一系列任务。你不明白哪一个?你被困在哪里了?
标签: algorithm