在Hangman游戏中,贪婪的字母频率算法是否等同于最佳获胜机会算法?
为了更好地猜测正确的答案,有没有值得牺牲保留你的剩余生命的案例?
进一步澄清问题:
动机:这个问题的灵感来自于http://www.datagenetics.com/blog/april12012/index.html
的有趣讨论他们提出了一种最佳解决单词游戏“Hangman”的算法。
他们的策略可以这样概括(编辑以供澄清):
在每个阶段,我们都在猜测最大数量的剩余可能单词中出现的字母(以前没有猜到)。
喜欢这种算法有一些动机 - 我们总是极少会失去生命。
但是,令我感到震惊的是,这不一定是最好的解决方案:如果我们试图猜测这个词(在一定数量的生命中),那么最常出现的字母并不总是如此。最有用的字母,以区分剩余的可用单词。
但是,我不确定,因为尽可能避免失去生命似乎是恰当的。最佳策略是否会让我们牺牲生命以获得更好的获胜机会?问题:这种贪心算法是否等同于最佳获胜机会算法? 你能证明吗?
示例字典+游戏非常适合展示防伪。
答案 0 :(得分:9)
假设以下词典:ABC ABD AEF EGH
。 (我会将没有问题的字母大写。)
假设你只有1点生命(使证明变得更容易......)。
上面提出的算法:
从A
开始,您将丢失(1/4)或保留aBC aBD aEF
(3/4)。
现在猜B
并丢失(1/3)或留下abC abD
(2/3)
现在猜猜C
或D
,你输了(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}。
最佳算法如下:
当然,这就是你如何解决任何游戏,并且由于指数大小的要求,它在很大程度上是难以处理的。除非你完全复制这一点,否则你无法获得最佳效果,而且我非常怀疑一个没有"看起来"前面两个或更多的动作可以希望复制这个。但是,您可以尝试按如下方式估算最佳策略。
在每一步重复以下步骤:
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__, _A_, __A, AA_, A_A, _AA, AAA}
中的每个可能结果。对于每个结果,使用Bayes's rule计算概率,以及新的可能词典(例如,在一种情况下,您有_A_:{cAt, bAt, rAt, ...}
和A__:{Art, Ark, Arm, ...}
的字典等。这些新词典中的每一个也具有size(postOutcomeDictionary dictionary)/size(preOutcomeDictionary)
形式的似然比;该比率的负数对数是选择传达给您的信息量(以位为单位)。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
你的算法会猜测a
或t
,它有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]的脚本。
我的基本策略是:
[^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
来获得准确的体重测量。
注意:此算法可以而且应该适应对手:
答案 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.这是最好的方法。证据留作练习。