假设我们正在玩游戏 hangman 。我的对手和我都可以在游戏期间访问该词典。我的对手从字典中选择了一个词,了解我将用来猜测他的秘密词的算法。一旦我的对手采摘了一个词,我只给了这个词的长度。我可以猜出一封我认为将在这个词中的信,如果它在这个词中,我的对手识别了那个字中该字母的所有位置。如果我猜一封不是这个词的字母,那就是一个错误。如果我能猜出太多错误之前的这个词,我赢了。

我的对手的目标应该是选择一个词,这最大化了我在猜测这个词之前制作的错误数量(不正确的猜测)。我的目标是最大限度地减少它们。 (传统上,如果错误的次数>一些号码,那么我就会失去游戏,但我们可以放松那个约束。)

考虑三算法来猜测。这些是我想到的主要原因,但可能更多,我欢迎替代的想法。在所有三种算法中,第一步将是收集与秘密词相同的单词列表。然后,对于字母表中的每个字母,计算包含该字母的字典中的单词数。例如,可能5000包含“A”,300包含“B”,等等。在这里,它是python:

    alphabet = list('abcdefghijklmnopqrstuvwxyz')

    while not found:
        probabilities = dict.fromkeys(alphabet, 0)

        for word in dictionary:
            for letter in word:
                if letter in alphabet:
                    probabilities[letter] += 1

        # now we have the letter frequencies

.

之后是三种算法发散的地方。

  1. 在第一个算法中,我们猜测了最多剩余单词的字母包含。因此,如果5000个剩余的单词包含“a”,并且没有其他字母都是很多单词,我们每次都会选择“a”。如果“A”是正确的,这为我们提供了我们可以进一步过滤列表的位置信息。例如,我们可能会通过匹配“.a ..”的所有单词过滤列表。 (点是未知的字母。)如果“a”不正确,我们会过滤掉包含“a”的所有单词。在存在领带的情况下,在等数量的单词中找到两个字母,字母按字母顺序选择字母。所以,如果我们知道这个词匹配“.ayay”,我们只需按字母顺序猜出单词。

  2. 这与第一算法略有不同。在绑架的情况下,我们在随机选择字母的情况下,而不是总是选择字母顺序。这有利于我们的对手不知道我们将选择什么。在第一次策略中,“光线”总是比“天”更好。这避免了该问题。

  3. 在这种情况下,我们选择具有与包含该字母的单词数量成比例的概率。在开始时,当我们统计包含“a”的单词数量和包含“b”等的单词的数量时,由于“a”发生在最多的单词中,在我们选择的策略1和2中被发现“ “100%的时间。相反,我们仍将多次选择“一个”,但少数次我们将选择“Z”,即使A可能被发现在10倍的单词中。我对此策略的疑虑是最佳的,但它在2010年的研究中使用了。

    所以我有两个问题:

    1. 我应该使用假设我的对手知道我将使用这个策略?在这方面,我们希望尽量减少猜测秘密词的平均猜测数量。
    2. 对于给定的单词,说“支付”,什么是我应该预期的误区的平均次数?是否有一个闭合的方式来计算m,而不是多次运行这个模拟并平均结果?
    3. 澄清

      • 可以使用任何英语词典。例如,带有84k字的英语词典。。为歧义仔细选择的词典子集也可能是有趣的,但在这个问题的范围之外。
      • 只要单词在字典中,单词大小没有约束。猜测者将在开始猜测之前了解这个词。
      • 只有错误的总数,它与单词尺寸无关。您不会为更长的单词或更少的机会获得更多机会。
      • 我只对最小化平均错误次数感兴趣。如果有两个最佳算法具有等效的平均错误次数,则都是可接受的。
      • 原则上是有可能选择一个字母的情况(说“b”)导致更多信息,而不是另一个信息(说“a”),即使“a”发生在比“b”中的更可能的单词中发生做。我也在练习中对这种可能性开放。上面说明的三种算法假设
由于正确的猜测倾向于产生的信息而不是不正确的一个(即,关于正确字母的位置信息通常比“这个字母更好”)。但是最佳算法不需要做出这个假设。
有帮助吗?

解决方案

可以计算最佳策略,但计算可能相当密集,我不确定它是否会在简单的启发式中提供大部分增益。我会解释在下面。主要思想是使用动态编程。

确定性策略

让我首先使用确定策略的特殊情况,以选择接下来的猜测的字母,因为它们最容易分析。在我们继续随机策略之前,这将给我们一个热身(可能是上级)。

在任何点处的游戏状态可以通过fire $(g,r)$ ,其中 $ g $ 是到目前为止猜到的一组字母, $ r $ 是响应(即,空白和字母序列 $ g $ 对播放器可见)。过去猜测的顺序无关紧要(这就是为什么它足以拥有一个SET $ G $ 的猜测)。我们会说一个词 $ w $ $(g,r)$ 如果它一致仍然是可能的,即,如果对手的单词是 $ w $ ,并且您将在 $ g $ 中猜测猜测然后,您将获得响应 $ r $

let $ p(g,r)= 1 $ 如果可以从这里赢得从州 $(g,r)$ 。这意味着存在胜利的策略:无论对手都在思考哪个词(只要它与 $(g,r)$ ) ,到目前为止,您已经成交的错误猜测数量,加上您将来的数字与此策略一起制作,不会超过上限。否则,定义 $ p(g,r)= 0 $

现在,使用复制关系

,可以使用动态编程计算 $ p(g,r)$

$$ p(g,r)=bigvee_a \ bigwedge _ {(g',r')} p(g',r'),$$

其中 $ a $ 范围在 $ g $ (即,所有可能性猜测哪个字母下一个),而 $(g',r')$ 范围在所有可能的响应范围内,如果您猜出 $ $ next(即 $ g'= g \ cup \ {a \} $ ,我们在所有单词 $ W $ $(g,r)$ 并计算响应 $ r'$ 猜测 $ g'$ 如果单词是 $ w $ ) 。

特别是,我建议您使用深度首先搜索和备忘,计算 $ p(g,r)$ 。然后, $ p(\ imptyset, - \ cdots - )$ 将告诉您是否可以在上限内赢得胜利,无论对手选择什么单词。通过向后跟踪计算,您可以重建最佳策略。

这是可行的吗?我希望它是。我认为可能的状态 $(g,r)$ 不是太大。 (特别是,您可以忽略状态 $(g,r)$ 在您已经做出了太多不正确的猜测,以及只有一个单词与之一致的任何状态该状态自动获胜,因此它不需要进一步分析。)作为优化,给定州 $(g,r)$ ,您可以尝试枚举所有单词 $ w $ 与它们一致,并模拟一些固定的启发式,并检查它是否会赢取每个单词;如果是这样,您无需进行任何进一步的深度遍历,您可以立即标记 $ p(g,r)= 1 $ 。此外,您只需要考虑猜测 $ a $ ,它出现在至少一个与 $(g, r)$

所以它应该非常简单地计算最佳的确定性策略。

随机策略

我们可以遵循类似的方法来处理随机策略,但它有点涉及。现在让 $ p(g,r)$ 表示从这里获胜的概率,如果我们在此处使用最佳策略。我们可以使用动态编程来再次计算此功能。

关键差异是在重复关系中,我们计算 $ p(g,r)$ 从数量 $ p(g',r')$ 其中 $(g',r')$ 范围可以在所有可能OCC的状态下

你曾经猜测一封信后。在这里,我们有一个简单的双人游戏。首先,我们选择不在 $ g $ 中的字母上的概率分布。然后对手看到了我们的分发,并选择一个关于 $ w $ 的分发,它与 $(g,r)一致$ 。我们的回报(以及对手失误的金额)等于我们在这里选择的概率。请注意,这可以从 $ p(g',r')$ 值来计算。事实证明,自从我们先去和对手看到我们的选择,对手不需要随机战略;它们可以与确定性策略相同,即,根据我们的分发选择单个单词 $ w $ 。如果我们形成矩阵 $ m $ 其中 $ m_ {w,i} $ 持有概率赢取如果我们选择字母 $ i $ next和对手选择字 $ w $ ;我们可以填写 $ m_ {w,i} $ 作为 $ p(g',r')$ 其中 $ g'= g \ cup \ {i \} $ $ r'$ 是响应猜测 $ g'$ 如果单词是 $ w $ 。然后,我们寻求解决优化问题 $$ \ max_v \ min_w(mv)_w= - \ min_v \ max_w - (mv)_w= - \ min_v \ | -mv \ | _ \ infty。$$ 这可以通过线性编程。所以,我们可以计算 $ p(g,r)$ 使用从值 $ p(g',r ')$ 其中 $ g'$ 是比 $ g $

将此全部放在一起,我们将使用备忘录(或动态编程)使用深度 - 首先遍历,在每个步骤中使用线性编程来解决2播放机游戏。这为我们提供了最佳的随机策略来玩刽子手。

所产生的计算可能非常昂贵,因为它需要数十亿或万亿步,您可以在每个步骤中解决线性程序。所以,我不知道在实践中使用它是否真实。

某些优化是可能的,如@j_random_hacker所示。首先,可以首先计算 $ p(g,r)$ 用于确定性策略;然后,您只需要考虑状态的随机策略 $(g,r)$ 其中 $ p(g,r)= 0 $

启发式策略

您列出了一些合理的启发式方法来选择策略。这是一个更启发式。鉴于州 $(g,r)$ ,枚举下一个猜测 $ a \ notin g $ 。让我们专注于单个字母 $ a $ 。然后,对于每个 $(g',r')$ ,它可以在猜测 $ a $ < / span>(所以 $ g'= g \ cup \ {a \} $ ),计算单词 $ W $ $(g',r')$ ;占据这些数字的最大值,并使用它作为与 $ a $ 相关联的计数。启发式策略是选择字母 $ a $ ,其数量最小。

计算预期的错误次数

您可以使用动态编程计算特定随机策略的预期错误次数。细节与上述类似,但重复关系变得更简单:它变得

$$ p(g,r)=min_w \ mathbb {e} [p(g',r'),$$

其中 $ w $ 范围与 $(g,r)$ ,和 $(g',r')$ 是下一个状态的分布如果单词是 $ w $ 并被猜测的下一封信由您的策略选择。鉴于您的策略和单词 $ w $ ,很容易计算猜测的分发,从而在下一个状态下获取分发,因此它很容易计算 $ \ mathbb {e} [p(g',r')$

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top