你需要做出一些关键性的假设,才能玩“Hangman”游戏。
- 你只需要猜一个单词,还是需要猜一个短语?
- 有些单词比其他单词更有可能吗?
请记住,如果你猜对了一个字母,你不会失去机会。
我将为你提供一个解决单词等概率情况的方案。两个单词的情况可以通过创建一个新的字典,该字典等于您当前字典的笛卡尔积来推广。比其他情况更可能的情况可以通过一些概率来推广。
在定义算法之前,我们定义了一个缩减的概念。如果我们要同时猜测L1、L2、L3...LN这些字母,那么我们会将字典缩小到一个更小的字典:一些单词将被
消除,并且还可能消除一些
字母。例如,如果我们有字典
{dog, cat, rat}
,并且我们猜测
a
,如果猜测正确,我们将消除{d,g},如果猜测错误,我们还将消除{c,r,t}。
最优算法如下:
- 考虑游戏树
- 查看所有节点,其中[#guesses left == 1]
- 如果没有节点,则游戏是不可能的;如果有一个节点,那就是你的答案
当然,这是解决任何游戏的方法,在大多数情况下,由于指数级别的空间要求,它是无法处理的。除非你完美地复制了这个过程,否则你无法得到最优解,我严重怀疑一个不“看”两步或更多步的策略能够希望复制这个过程。但是,你可以尝试以下近似最优策略。
在每个步骤中重复以下步骤:
- 考虑每个字母:选择会最大化预期词典缩减/预期惩罚的字母,也就是说,选择会最大化(
frac words with L
#words without L
+ frac words without L
#words with L
)/(# words without L
/# words total
)的字母...请注意,如果所有单词都有某个字母,这可能是无限的,如果是这样,请继续猜测,因为没有惩罚。
- 进行猜测,获取更新的游戏状态
- 消除所有因新板而失效的单词
当然,如果你的词典条目超过
2^[最大猜测次数]
,在等概率世界中“Hangman”游戏几乎是不可能的(除非词典受到高度限制),因此你必须在不等概率的世界中工作。在这个世界里,你不是最大化你所做的消除量,而是最大化“预期惊异”(也称为熵)。每个单词都有一个先验概率(例如,假设单词“putrescent”的概率为0.00001,“hangman”的概率为0.002)。惊异等于概率,以比特为单位衡量(概率的负对数)。猜测的答案将产生没有字母、一个字母或多个字母的回答(许多可能性)。因此:
- 对于每个可能的猜测,考虑该猜测的影响
- 对于猜测的每种可能结果,考虑该结果的概率。例如,如果你为一个三个字母的单词猜测“A”,你必须考虑集合
{A__,_A_,__A,AA_,A_A,_AA,AAA}
中每种可能的结果。对于每个结果,使用贝叶斯规则计算概率,以及新的可能词典(例如,在某种情况下,你将有一个词典_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
你的算法会猜测a或t,这两个字母有5/8的概率免费减小词典大小至5/8,还有3/8的概率以1的代价将词典大小减小至3/8。你需要选择能够揭示最多信息的字母。在这种情况下,你应该猜测S,因为它有4/8的概率免费将词典减小至4/8,1/8的概率将词典免费减小至1/8,还有3/8的概率以1的代价将词典减小至3/8。这是更好的选择。
编辑: 我想使用一个英语词典的例子来说明这不是人工制造的,并假设人们可以从例子中推断出来,而不会卡在非严格相等上。然而,这里有一个明确的反例:你有2000个单词。1000个单词在第一个位置包含字母A。另外1000个单词包含嵌入在别处的唯一组合的B。例如,?B???, ??B??, ???B?, ????B, ?BB??, ?B?B?等。'?'代表随机选择的字符。除了一个单词(其中'?'是'A')之外,第一个位置中没有A,因此A的频率严格大于B的频率。建议的算法会猜测A,这将导致{50%:choices_halved,50%:choices_halved & lose_one_life}的结果,而此算法将指定选择B,这将导致{50%:YOU_WIN,50%:choices_halved & lose_one_life}的结果。百分比略微近似四舍五入。(不,一个有双字母的单词不会对'频率'产生两倍的贡献,但即使在一个疯狂的定义下它真的这样做了,你也可以轻松地修改这个例子,使单词以AAA...A开头。)
(关于评论: 在这个例子中抱怨严格相等是不合理的,例如"999/2000",因为你可以使概率彼此任意接近。)
(这指出了一个有趣的侧面注释: 如果字典足够大,有时可能无法进行hangman游戏,一种策略应该放弃它不希望能够猜到的单词。例如,如果它只剩下2个动作,它应该进行最高可能性的假设,消除了超过2个动作位的惊喜。)