【问题标题】:Donald Knuth Algorithm MastermindDonald Knuth 算法大师
【发布时间】:2020-06-17 13:22:31
【问题描述】:

我正在开发一个实现 Donald Knuth 算法的策划游戏。前五个步骤很清楚。我必须为每个可能的答案创建一组排列,使用 1122 作为我的第一个猜测,将集合中的每个可能答案与 1122 进行比较,然后删除任何不返回与当前猜测相同反馈的可能答案。现在的问题在于确定下一个猜测以及我应该如何实现第 6 步。算法如下所示。

Mastermind-Five-Guess-Algorithm Donal Knuth 用于解决游戏 Mastermind 的五次猜测算法。

1977 年,Donald Knuth 证明密码破解器可以解决 五步或更少的模式,使用渐进式算法 减少了可能的模式数量。

算法的工作原理如下:

  1. 创建包含 1296 个可能代码的集合 S(1111、1112 ... 6665、6666)。

  2. 从最初的猜测 1122 开始(Knuth 给出的示例显示其他最初的猜测,例如 1123、1234 在五次尝试中都不会获胜 每个代码)。

  3. 猜猜得到彩色和白色钉子的答案。

  4. 如果响应是四个彩色钉子,则游戏获胜,算法终止。

  5. 否则,如果当前猜测是代码,则从 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

  6. 应用 minimax 技术找到下一个猜测,如下所示:
    对于每个可能的猜测,即 1296 的任何未使用代码,而不仅仅是 S 中的那些,计算 S 中有多少可能性会被消除 对于每个可能的彩色/白色挂钩分数。猜测的分数是 它可能从 S 中消除的最小可能性。

    A 对于 1296 的每个未使用的代码,通过 S 的单循环将提供一个 每个可能的彩色/白色挂钩分数的“命中数”;创造 一组具有最小最大分数的猜测(因此是 minmax)。
    来自 具有最小(最大)分数的一组猜测,选择一个作为 下一个猜测,尽可能选择 S 的成员。

    Knuth 遵循选择数字最少的猜测的约定 价值例如2345低于3456。Knuth也举了个例子 表明在某些情况下,S 的任何成员都不会是最高的 得分猜测,因此猜测不能在下一回合获胜,然而 将有必要确保五场胜利。

  7. 从第 3 步开始重复

    Link to Wikipedia page

【问题讨论】:

  • 第6点确实是一系列任务。你不明白哪一个?你被困在哪里了?

标签: algorithm


【解决方案1】:

取一组未尝试过的代码,并将其称为 T。

迭代 T,将每个代码视为猜测 g​​。

对于每个 g,再次迭代 T 将每个代码视为可能的真正隐藏代码 c。

如果实际代码为 c,则计算通过猜测 g 产生的黑白挂钩分数。就这样吧。

保留一张可能得分的小表格,并在迭代可能的 c 时,跟踪有多少代码产生每个得分。也就是说,c的选择有多少产生二黑一白,有多少产生二黑二白,以此类推。

当您考虑了所有可能的代码(对于那个 g)时,请考虑 最常出现的分数。您可以称其为信息量最少的可能结果猜测 g。那就是g的分数;越低越好。

当您迭代 g 时,跟踪得分最低的猜测。这就是猜测。

【讨论】:

  • 我是在遍历所有 1295 个答案,还是只是从整个列表中过滤掉的那些?
  • @darkPhoenix:正如我所说,未尝试代码。这要么是您从整个 1296 列表中过滤掉的,要么是您没有从列表中过滤的,这取决于您所说的“过滤”。
猜你喜欢
  • 2019-05-18
  • 1970-01-01
  • 2023-03-21
  • 2014-02-21
  • 2014-05-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
相关资源
最近更新 更多