用AI方式解决Hangman问题

时间:2012-02-09 05:31:23

标签: algorithm

我将其命名为“AI方式”,因为我正在考虑让应用程序在没有人类交互的情况下玩刽子手游戏。

场景是这样的:

  1. 一个可用的单词列表,其中包含数十万个英文单词。
  2. 应用程序将从列表中选择一定数量的单词,例如20个。
  3. 应用程序对每个单词发挥Hangman,直到WON或FAILURE。 这里的限制是最大错误的错误猜测。 26显然没有意义,让我们说6最大错误的猜测。
  4. 我尝试了wiki page中提到的策略,但效果不佳。 基本上成功率约为30%。

    有关策略的任何建议/意见以及我应该挖掘哪些领域才能找到合理的策略?

    非常感谢。

    -Simon

    PS:看起来相当不错的JavaScript实现。     (https://github.com/freizl/play-hangman-game

3 个答案:

答案 0 :(得分:7)

更新了主题

  1. 下载单词词典并将其放入您选择的某个数据库或结构中
  2. 当出现一个单词时,将您的猜测缩小到相同长度的单词并执行字母频率分布(您可以使用字典和/或列表集合进行快速分布分析和排序)
  3. 从此列表中选择最常见的字母
  4. 如果找到该字母,请根据已知字母和字长创建正则表达式,并从步骤2开始重复
  5. 您应该可以快速缩小模式搜索产生的单个词语
  6. 后人:

    看看这个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_末尾的字符可能(比方说)为ds

或者你可以使用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)算法,显然你不能走太远那条路。