我将其命名为“AI方式”,因为我正在考虑让应用程序在没有人类交互的情况下玩刽子手游戏。
场景是这样的:
我尝试了wiki page中提到的策略,但效果不佳。 基本上成功率约为30%。
有关策略的任何建议/意见以及我应该挖掘哪些领域才能找到合理的策略?
非常感谢。
-Simon
PS:看起来相当不错的JavaScript实现。 (https://github.com/freizl/play-hangman-game)
答案 0 :(得分:7)
更新了主题
后人:
看看这个wiki page。它包括一个字母的第一个字母的频率表,可以帮助您调整算法。
你还可以考虑这样一个事实,即如果你发现一个或两个元音,找到其他元音的可能性会显着下降,你应该尝试更多常见的辅音。你列出的wiki页面的例子以E然后是T开头,然后连续尝试三个元音:A,O和I.前两个字母都被遗漏了,但是一旦找到第三个字母,两次然后过程应该切换到公共辅音和跳过尝试更多的元音,因为可能会更少。
任何有用的策略肯定会在字母和可能的单词上使用频率分布图,例如有些单词很常见而其他单词很少使用,所以在一组更常见的单词上执行字母频率分布可能会有所帮助......猜测某些单词可能比其他单词更频繁地出现,但这取决于您的单词选择算法可能不会考虑“常见”用法。
您还可以构建专门的字母频率表,甚至可以即时构建。例如,给定维基百科h a ngm a n示例:您在第2和第6个位置的单词中找到字母A两次。你知道这个单词有七个字母,并且有一个相当简单的注册表,你可以将字词与符合这种模式的字典隔离开来:
_ a _ _ _ a _
然后对与该模式匹配的那组单词执行字母频率,并将该集合用于下一次猜测。冲洗并重复。我认为做一些我提到过的事情,尤其是最后一件事,真的会增加你成功的几率。
答案 1 :(得分:3)
链接页面中的策略似乎是“按字母频率排序猜测”和“猜元音,然后按字母频率排序猜测”
关于刽子手的一些观察:
1)由于猜测不在单词中的字母会伤害我们,我们应该按字频率(包含字母X的单词的百分比)猜字母,而不是字母频率(X出现在所有单词中的次数) 。这应该最大化我们猜测坏信的机会。
2)一旦我们正确地猜到了一些字母,我们就会更多地了解我们想要猜出的字。
以下两种策略应该超越字母频率策略。我假设我们有一本可能出现的词典。
1)我们知道目标词n
的长度。删除字典中不长n
2)计算字典中所有字母的单词频率
3)猜猜我们尚未猜到的最常见的信件。4)如果我们猜对了,请删除字典中与所显示的字母不匹配的所有单词。
5)如果我们猜错了,请删除所有包含错误猜测字母的单词
6)转到第2步
为获得最大效果,不要计算步骤2中所有字母的字频,而是计算目标字中仍为空白的位置中所有字母的字频。
1)从字典中,为某个n值(比如2)建立一个n-grams
表。如果您之前没有遇到过n-gram,那么它们就是单词中的连续字母组。例如,如果单词为"word"
,则2-gram为{^w,wo,or,rd,d$}
,其中^
和$
标记单词的开头和结尾。计算这些2克的单词频率。
2)首先按字频猜测单个字母,如上所述
3)一旦我们有了一些命中,我们就可以使用n-gram的词频表来确定从我们的猜测中消除的字母,或者我们可能猜到的字母。有很多方法可以实现这一目标:
例如,您可以使用2克来确定w_rd
中的空白可能不是z
。或者,您可以确定单词___e_
末尾的字符可能(比方说)为d
或s
。
或者你可以使用n-gram来生成可能的字符列表(尽管这对于长单词来说可能是昂贵的)。请记住,你总是可以勾掉所有包含你猜到的不在目标词中的字母的n-gram。
请记住,在每一步你都不会做出错误的猜测,因为这样可以让我们活着。如果n-gram告诉你一个位置可能只是(例如)a,b或c,并且你的单词频率表告诉你a出现在30%的单词中,但b和c只出现在10%中,然后猜测a
。
为了获得最大收益,您可以将这两种策略结合起来。
答案 2 :(得分:1)
所讨论的策略适合人类实施。由于您正在编写AI,因此可以为其提供计算能力以获得更好的结果。
使用您的单词列表,将其过滤到仅与您对目标单词有关的信息。 (在开头只会是单词长度。)对于每个字母A到Z,请注意有多少单词至少包含其中一个单词(这与字母数不同。)选择得分最高的字母。 / p>
你可能甚至可以在计算猜测时运行多个循环,但即使对于现代CPU来说也可能证明太多。
澄清:我说你可能会先行一步。如果我们在这个级别选择“A”,那么下一级别的选项会是什么?这是一个O(x ^ n)算法,显然你不能走太远那条路。