关于什么是“刽子手”游戏,您必须做出一些关键假设。
- 你只需要猜一个词,还是需要猜一个词组?
- 有些词比其他词更有可能吗?
要记住的一件事是,如果你选择了一个正确的字母,你就不会失去猜测。
我将为一个单词和同样可能的情况提供一个解决方案。可以通过创建一个与当前字典的笛卡尔积相等的新字典来概括两个词的情况。比其他情况更有可能的情况可以用一点概率来概括。
在我们定义我们的算法之前,我们先定义一个归约的概念。如果我们将字母 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
) 的字母 L...请注意,如果所有这些都可能是无限的单词有一个特定的字母,在这种情况下继续猜测它,因为没有惩罚。
- 猜一猜,获取更新的棋盘状态
- 消除所有被新板作废的字
当然,如果你的字典有多个2^[max number of guesses]
词条,“刽子手”游戏在等概率世界中几乎是不可能的(除非字典受到高度限制),所以你必须在不等概率世界中工作。在这个世界上,不是最大化你所做的消除量,而是最大化“预期的惊喜”(也称为熵)。您关联的每个单词都有一个先验概率(例如,假设单词“putrescent”的可能性为 0.00001,单词“hangman”的可能性为 0.002)。惊喜等于机会,以比特为单位(机会的负对数)。一个猜测的答案要么不产生字母,要么产生一个字母,要么产生一个以上的字母(许多可能性)。因此:
- 对于每个可能的猜测,考虑猜测会产生的影响
- 对于猜测的每个可能结果,请考虑该结果的概率。例如,如果您猜 'A' 是 3 个字母的单词,则必须考虑 set 中的每个可能结果
{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=='___')
;万一这是无穷大,没有什么可失去的,我们会自动选择它。
所以回答你的问题:
>在游戏刽子手中,贪心字母频率算法是否等同于最佳获胜机会算法?
显然不是:如果字典是
cATs
bATs
rATs
vATs
sATe
mole
vole
role
您的算法会猜测a
or t
,它有 5/8 的机会免费将您的字典减小到 5/8 大小,并且有 3/8 的机会将您的字典减小到 3/8 大小而成本为 1。您想选择透露最多信息的信件。在这种情况下,您应该猜到 S,因为它有 4/8 的机会免费将您的字典缩小到 4/8 大小,有 1/8 的机会免费将您的字典缩小到 1/8 大小,以及 3/ 8 机会以 1 的成本将字典缩小到 3/8 大小。这绝对更好。
编辑:我想使用一个英语词典示例(上图)来演示这不是人为的,并假设人们可以从示例中推断出来而不会被非严格相等所困扰。然而,这里有一个明确的反例:你有 2000 个单词。1000 个单词A
首先包含该字母。其他 1000 个单词包含B
嵌入其他地方的 s 的独特组合。例如,?B???
, ??B??
, ???B?
, ????B
, ?BB??
,?B?B?
等。?
s 代表随机选择的字符。第一个 ?中没有A
s,除了一个单词(其 ? 是“A”),因此A
s 的频率严格大于B
s 的频率。所提出的算法会猜测A
这将导致{50%:choices_halved,50%:choices_halved & lost_one_life},而此算法将指示B
导致{50%:YOU_WIN,50%:choices_halved & lost_one_life}的选择。百分比已略微四舍五入。(不,带有双字母的单词不会对“频率”产生两倍的影响,但即使它在一个疯狂的定义下确实如此,您也可以通过使单词以 . 开头来简单地修改这个示例AAA...A
。)
(关于评论:在这个例子中抱怨严格相等是不合理的,例如“999/2000”,因为你可以让概率任意接近彼此。)
(这指出了一个有趣的旁注:如果字典足够大以至于有时无法执行刽子手,那么策略应该丢弃它不希望能够猜测的猜测。例如,如果它只剩下 2 步,它应该做出尽可能高的概率假设,以消除具有超过 2 步的惊喜的子树。)