获胜Hangman的优化算法

时间:2012-03-30 12:23:42

标签: algorithm probability greedy game-theory

在Hangman游戏中,贪婪的字母频率算法是否等同于最佳获胜机会算法?

为了更好地猜测正确的答案,有没有值得牺牲保留你的剩余生命的案例?

进一步澄清问题:

  • 要猜测的所选单词取自已知词典。
  • 你有N个生命,因此必须最大限度地猜测单词中所有字母的概率,而不会产生N 错误(即你可能有无限数量的正确猜测)。
  • 为了这个练习,词典中的每个单词具有相同的概率(即单词是随机选择的)
    • 更难的练习是提出一个针对恶意的,无所不知的词选择策略(我不是在这里要求)

动机:这个问题的灵感来自于http://www.datagenetics.com/blog/april12012/index.html

的有趣讨论

他们提出了一种最佳解决单词游戏“Hangman”的算法。

他们的策略可以这样概括(编辑以供澄清):

  • 我们可以假设这个词来自特定字典
  • 我们知道单词
  • 中的字母数
  • 删除字典中没有正确字母数的所有字词。
  • 选择尚未猜到的字母,该字母出现在字典剩余子集中的最大字数中。
  • 如果出现这封信,我们知道它的位置。
  • 如果没有出现这封信,我们知道这封信不会出现。
  • 消除字典子集中不完全符合此正确模式的所有单词,然后重复。
  • 如果有两个(或更多)字母经常出现,算法可以对位置进行更深入的分析,以确定哪一个是首选的(如果这是合理的?)

在每个阶段,我们都在猜测最大数量的剩余可能单词中出现的字母(以前没有猜到)。

喜欢这种算法有一些动机 - 我们总是极少会失去生命。

但是,令我感到震惊的是,这不一定是最好的解决方案:如果我们试图猜测这个词(在一定数量的生命中),那么最常出现的字母并不总是如此。最有用的字母,以区分剩余的可用单词。

但是,我不确定,因为尽可能避免失去生命似乎是恰当的。最佳策略是否会让我们牺牲生命以获得更好的获胜机会?

问题:这种贪心算法是否等同于最佳获胜机会算法? 你能证明吗?

示例字典+游戏非常适合展示防伪。

7 个答案:

答案 0 :(得分:9)

假设以下词典:ABC ABD AEF EGH。 (我会将没有问题的字母大写。)
假设你只有1点生命(使证明变得更容易......)。

上面提出的算法:

A开始,您将丢失(1/4)或保留aBC aBD aEF(3/4)。
现在猜B并丢失(1/3)或留下abC abD(2/3) 现在猜猜CD,你输了(1/2)或赢了(1/2) 获胜的可能性:3/4 * 2/3 * 1/2 = 1/4。

现在尝试其他方法:

E开始,您将丢失(1/2)或保留AeF eGH(1/2)。
现在你知道猜对了什么 获胜的可能性:1/2。

显然,提出的算法并不是最优的。

答案 1 :(得分:7)

对于" Hangman"的游戏,你必须做出一些重要的假设。是

  • 你只需要猜一个字,或者你需要猜一个短语吗?
  • 某些词比其他词更有可能吗?

要记住的一件事是,如果你选择了一个正确的字母,你就不会失去猜测。

我将为单字和& -equally-possible案例提供解决方案。这个双字案例可以通过创建一个等于当前字典的笛卡尔积的新字典来推广。比其他情况更可能的情况可以用一点概率推广。

在我们定义算法之前,我们定义了减少的概念。如果我们在ONCE猜测字母L1,L2,L3,...... LN,那么我们会将字典缩小为较小的字典:某些字会被消除,另外还有一些字母也可以被删除。例如,如果我们有字典{dog, cat, rat}并且我们猜测a,如果猜测为真,我们将消除{d,g},或者如果它是假的则消除{c,r,t}。

最佳算法如下:

  • 考虑game tree
  • 查看[#guesses left == 1]
  • 的所有节点
  • 如果没有节点,则游戏是不可能的;如果有节点,那就是你的答案

当然,这就是你如何解决任何游戏,并且由于指数大小的要求,它在很大程度上是难以处理的。除非你完全复制这一点,否则你无法获得最佳效果,而且我非常怀疑一个没有"看起来"前面两个或更多的动作可以希望复制这个。但是,您可以尝试按如下方式估算最佳策略。

在每一步重复以下步骤:

  • 考虑每个字母:选择最大化预期字典减少每个预期惩罚的字母:即选择字母L,这将最大化(frac words with L #words without L + frac words without L #words with L)/(# words without L / # words total)...请注意,如果所有单词都有某个字母,这可能是无限的,在这种情况下继续猜测,因为没有惩罚。
  • 猜测,获得更新的董事会状态
  • 消除新董事会无效的所有字词

当然,如果你的词典有超过2^[max number of guesses]条,那么" Hangman"在等概率世界中游戏几乎是不可能的(除非字典受到高度约束),因此你必须在不等概率世界中工作。在这个世界上,你不是最大化你所做的消除量,而是最大限度地提高预期的惊喜度。 (也称为熵)。每个单词都与先前的概率相关联(例如,让我们说这个单词有0.00001的可能性,而且这个单词有0.002的机会是“hangman'”)。惊人的等于机会,以比特(机会的负对数)来衡量。猜测的答案将不会产生任何字母,单个字母或多个字母(多种可能性)。因此:

  • 对于每个可能的猜测,请考虑猜测的效果
  • 对于每个可能的猜测结果,考虑该结果的概率。例如,如果你猜到了' A'对于一个3个字母的单词,您必须考虑集{A__, _A_, __A, AA_, A_A, _AA, AAA}中的每个可能结果。对于每个结果,使用Bayes's rule计算概率,以及新的可能词典(例如,在一种情况下,您有_A_:{cAt, bAt, rAt, ...}A__:{Art, Ark, Arm, ...}的字典等。这些新词典中的每一个也具有size(postOutcomeDictionary dictionary)/size(preOutcomeDictionary)形式的似然比;该比率的负数对数是选择传达给您的信息量(以位为单位)。
  • 因此,您希望根据预期成本最大化您获得的预期信息量(以位为单位)的比率(如果您失败,则成本罚分为1,如果不是,则为0)。对于每个猜测,以及对于每个猜测结果,获得的信息位是bitsGainedFromOutcome[i] = -log(size(postOutcomeDictionary)/size(preOutcomeDictionary))。我们采用这些加权和:sum{i}( prob(outcome[i])*bitsGainedFromOutcome[i] ),然后除以我们错误的概率:prob(outcome=='___')
  • 我们选择最小sum{i}( prob(outcome[i])*bitsGainedFromOutcome[i] )/prob(outcome=='___')的字母;万一这是无限的,没有什么可失去的,我们会自动选择它。

所以回答你的问题:

  

> 在游戏Hangman中,贪婪的字母频率算法是否等同于最佳获胜机会算法?

显然不是:如果字典是

cATs
bATs
rATs
vATs
sATe
mole
vole
role

你的算法会猜测at,它有5/8的机会将你的字典减少到5/8大小免费,并有3/8的机会将你的字典减少到3 / 8尺寸,成本为1.您希望选择显示最多信息的字母。在这种情况下,你应该猜测S,因为它有4/8的机会将你的字典减少到4/8大小免费,1/8的机会将你的字典减少到1/8大小免费,并且3 /将你的字典减少到3/8尺寸的成本为1的几率。这绝对是更好的。

编辑:我想用一个英文字典示例(上图)来演示这不是人为的,并假设人们可以从示例中推断而不会挂在非严格的平等上。但是,这里有一个明确的反例:你有2000个单词。 1000个单词首先包含字母A。其他1000个单词包含嵌入其他地方的B s的唯一组合。例如,?B?????B?????B?????B?BB???B?B?等。? s随机表示 - 选择字符。第一个?中没有A个,除了一个单词(其中的?是' A'),因此A s的频率严格大于频率B的。{所提出的算法将猜测A,这将导致{50%:choices_halved,50%:choices_halved& lose_one_life},而这个算法将决定选择B,导致{50%:YOU_WIN,50%:choices_halved& lose_one_life}。百分比略有下降。 (不,带有双字母的单词对频率'没有贡献两倍,但即使它是在一个疯狂的定义下做的,你也可以通过使单词以{{1}开头来简单地修改这个例子。 }。)

(关于评论:在这个例子中抱怨严格的平等是不合理的,例如" 999/2000",因为你可以使概率任意地彼此接近。)

(这指出了一个有趣的旁注:如果字典足够大,有时候不可能使刽子手变得不可能,那么策略应该抛弃那些预期无法猜测的猜测。例如,如果它只有2个向左移动,它应该做出最高概率的假设,它可以消除超过2次移动的超出意义的子树。)

答案 2 :(得分:3)

我写了一个solves hangman optimally [github]的脚本。

我的基本策略是:

  • 对于像..e ..这样的模式,用试过的字母:e,s,t
  • 检查只有n位数字(在这种情况下为5)
  • 创建可能的单词列表
    • 根据提供的信息
    • 创建一个正则表达式
    • 在这种情况下,它将是[^est][^est]e[^est][^est]
    • 解析与此正则表达式相匹配的单词的单词列表
  • 循环显示每个单词,计算每个单词出现的次数
  • 您最佳的下一个猜测是最有可能的字母

答案 3 :(得分:2)

关于你尝试猜测单词的想法,而不是试图猜测字母,肯定可能有一些孤立的情况,你从第一次尝试或类似的东西猜测这个单词,但这不会使该算法更好平均情况。这是关于预期的概率。

可以对该算法进行一些改进(在Lajos发布的版本中)是一些更有用的信件选择。
这可以通过增加一个权重来实现:考虑每个单词的用法是语言的词汇。

例如,技术,医学,法律等词语的机会要低得多。

拿这本词典(带有一些使用权重):

frost    6
guilt    5
genes    1
fever    2
meter    1

这里e是最常见的字母,所以它会被选中。这意味着只留下医学术语,这是非常不可能的。但如果决定采取:

weight(letter) = w * frequency +
              (1 - w) * sum( usage_weight(word) where letter in word )

然后,很可能会选择t


因为(假设w = 0.2):

weight(e) = 0.2 * 3   +   0.8 * (1 + 2 + 1)
          = 3
weight(r) = 0.2 * 3   +   0.8 * (1 + 2 + 6)
          = 7.8
weight(t) = 0.2 * 3   +   0.8 * (1 + 5 + 6)
          = 10.2

注意:我们当然应该使用标准化权重,例如frequency / num_words来获得准确的体重测量。

注意:此算法可以而且应该适应对手:

  • 在与人类比赛时,更常见的话语会增加体重
  • 在对抗AI时,取决于难度级别:
    • 关于平常目标的简单目标
    • 在难度级别上瞄准不寻常的话语

答案 4 :(得分:0)

不,这个贪婪的算法并不是最好的,我可以通过提供更好的解决方案来证明:

在每一步中我们都知道字母的数量,我们知道一些字母。我们从我们的一组单词中选择所有单词,这些单词在给定位置具有给定的字母,并且它们的长度与所讨论的单词的长度相匹配。我们从所选词组中选择最常用的字母并猜测给定的字母。对于每一个猜测,猜测的字母都会被标记为猜测,并且将来不会再次猜到。这样你就有比你问题中描述的贪婪算法更好的生存机会。

编辑:

在澄清问题并做出进一步的规范之后,我得出的结论是算法是最优的。

如果我们有n个具有给定长度的单词,包含所有正确的猜测(“好字母”)并且不包含任何错误的猜测(“坏字母”),x生活,我们可以查看字母的频率仍然可能的单词,并选择频率最高的字母,让我们假设y字包含字母。

在这种情况下,此猜测的置信度为y / n,这大于任何其他字母的置信度,这提供了更高的生存机会。所以,这样的步骤是最佳的。如果您按照这种精神制定了一系列仅包含步骤的步骤,那么一系列步骤也将是最佳的,因此该算法是最佳的。

但是,如果我们有任何额外的信息(比如对这个词的描述,或者知道在短时间内有两次相同的词的概率),这个算法可以根据额外的信息,所有的词来增强在单词集合中将具有适应值(基于额外信息的概率),并且单词中的所有字母类型将基于适合度分数进行加权。

答案 5 :(得分:0)

answer清楚地说明了为什么贪婪算法不是最佳算法,但没有回答如果我们偏离贪婪路径,我们可以得到的更好的结果。

如果我们假设您与计算机对手比赛时所有单词的可能性相同。如果选择4个字母,6个生命的字母,那么您可以选择仅查看第二受欢迎的字母,则您获胜的概率从55.2%增加到58.2%,如果您愿意再检查一个字母,则获胜的概率会增加到59.1%。 / p>

代码:https://gist.github.com/anitasv/c9b7cedba324ec852e470c3011187dfc

使用ENABLE1(具有172820个单词的拼写字典)进行全面分析,该字典具有2至6个字母,0至10个生命以及1贪心到4贪心。当然,每条策略在25条生命中都等于100%的获胜率,因此不会超过10条生命。超过4个贪婪只会稍微提高概率。

letters, lives, 1-greedy, 2-greedy, 3-greedy, 4-greedy


2 letters 0 lives   3.1%    3.1%    3.1%    3.1%
2 letters 1 lives   7.2%    7.2%    7.2%    8.3%
2 letters 2 lives   13.5%   13.5%   13.5%   14.5%
2 letters 3 lives   21.8%   21.8%   22.9%   22.9%
2 letters 4 lives   32.2%   33.3%   33.3%   33.3%
2 letters 5 lives   45.8%   45.8%   45.8%   45.8%
2 letters 6 lives   57.2%   57.2%   57.2%   57.2%
2 letters 7 lives   67.7%   67.7%   67.7%   67.7%
2 letters 8 lives   76%     76%     76%     76%
2 letters 9 lives   84.3%   84.3%   84.3%   84.3%
2 letters 10 lives  90.6%   91.6%   91.6%   91.6%


3 letters 0 lives   0.9%    1.1%    1.1%    1.1%
3 letters 1 lives   3.4%    3.8%    3.9%    3.9%
3 letters 2 lives   7.6%    8.4%    8.6%    8.8%
3 letters 3 lives   13.7%   15%     15.1%   15.2%
3 letters 4 lives   21.6%   22.8%   23.3%   23.5%
3 letters 5 lives   30.3%   32.3%   32.8%   32.8%
3 letters 6 lives   40.5%   42%     42.3%   42.5%
3 letters 7 lives   50.2%   51.4%   51.8%   51.9%
3 letters 8 lives   59.6%   60.9%   61.1%   61.3%
3 letters 9 lives   68.7%   69.8%   70.4%   70.5%
3 letters 10 lives  77%     78.3%   78.9%   79.2%


4 letters 0 lives   0.8%    1%      1.1%    1.1%
4 letters 1 lives   3.7%    4.3%    4.4%    4.5%
4 letters 2 lives   9.1%    10.2%   10.6%   10.7%
4 letters 3 lives   18%     19.4%   20.1%   20.3%
4 letters 4 lives   29.6%   31.3%   32.1%   32.3%
4 letters 5 lives   42.2%   44.8%   45.6%   45.7%
4 letters 6 lives   55.2%   58.2%   59.1%   59.2%
4 letters 7 lives   68%     70.4%   71.1%   71.2%
4 letters 8 lives   78%     80.2%   81%     81.1%
4 letters 9 lives   85.9%   87.8%   88.4%   88.7%
4 letters 10 lives  92.1%   93.3%   93.8%   93.9%


5 letters 0 lives   1.5%    1.8%    1.9%    1.9%
5 letters 1 lives   6.1%    7.5%    7.9%    8%
5 letters 2 lives   15.9%   18.3%   18.9%   19.2%
5 letters 3 lives   30.1%   34.1%   34.8%   34.9%
5 letters 4 lives   47.7%   51.5%   52.3%   52.5%
5 letters 5 lives   64.3%   67.4%   68.3%   68.5%
5 letters 6 lives   77.6%   80.2%   80.6%   80.8%
5 letters 7 lives   86.9%   88.6%   89.2%   89.4%
5 letters 8 lives   92.8%   94.1%   94.4%   94.5%
5 letters 9 lives   96.4%   97.1%   97.3%   97.3%
5 letters 10 lives  98.2%   98.6%   98.8%   98.8%


6 letters 0 lives   3.2%    3.7%    3.9%    3.9%
6 letters 1 lives   12.6%   14.3%   14.9%   15%
6 letters 2 lives   29.2%   32.2%   32.8%   33%
6 letters 3 lives   50.1%   53.4%   54.2%   54.4%
6 letters 4 lives   69.2%   72.4%   73.1%   73.2%
6 letters 5 lives   83.1%   85.5%   85.9%   86.1%
6 letters 6 lives   91.5%   92.9%   93.2%   93.2%
6 letters 7 lives   95.8%   96.5%   96.7%   96.8%
6 letters 8 lives   97.9%   98.3%   98.4%   98.5%
...

答案 6 :(得分:-1)

选择一个字母,将剩余的有效字分成两组几乎相等的大小。有了位置信息,可能会有超过2套。重复,直到你的设置大小为1.这是最好的方法。证据留作练习。