【问题标题】:Looking for a better evaluation method for a genetic algorithm寻找更好的遗传算法评估方法
【发布时间】:2014-05-04 20:26:11
【问题描述】:

我目前正在尝试用一种不寻常的方法,一种遗传算法来解决 reddit 上的hard Challenge #151。

简而言之,在将字符串分隔为consonants 和vowels 并删除spaces 之后,我需要将它们放在一起,而不知道先出现哪个字符。

hello world 分别为hllwrld 和eoo,需要重新组合在一起。例如,一种解决方案是hlelworlod,但这没有多大意义。采用所有可能解决方案的详尽方法有效,但不适用于较长的问题集。

我已经拥有的

  • 英文单词频率数据库
  • 一种算法,使用 Zipf 定律构建相对 cost 数据库,并且可以一致地将单词与没有空格的句子分开(借用自 this question/answer
  • 一种将辅音和元音放入堆栈并从其中一个中随机获取一个字符并将其编码为由1 和2 组成的字符串的方法,有效地将结构编码为gene。该示例的正确gene 将是1211212111
  • 一种改变这种字符串的方法,随机交换字符

我尝试了什么

生成 500 个随机序列,使用 infer_spaces() 方法并使用所有单词的成本评估适合度,从其中取出最好的 25% 并变异 4 个新序列,适用于小字符串,但经常陷入局部最小值,特别是对于较长的序列。 Hello World 已在第一代中找到,thisisnotworkingverygood(已正确分离,成本为 41.223)在第二代中已收敛到 th iss n ti wo or king v rye good(270 成本)。

我需要什么

显然,使用计算成本作为评估方法仅适用于分离语法正确的句子,不适用于这种遗传算法。你有更好的想法我可以尝试吗?还是解决方案的另一部分,例如gene 的表示,是问题所在?

【问题讨论】:

  • 在下面查看我新编辑的答案。我完整描述了如何使用 GA 解决问题,尽管我坚信深度优先搜索会更快并且更好地处理更大的输入。

标签: python algorithm genetic-algorithm


【解决方案1】:

我会将问题简化为两部分,

  1. 寻找候选词将字符串拆分成(所以 hllwrld => hll wrld)
  2. 然后如何通过添加元音来扩展这些单词。

我会首先获取您的词频词典,并对其进行处理以创建第二个不带元音的词列表,以及每个折叠词的可能元音列表(以及相关频率)。从技术上讲,您不需要 GA 来解决这个问题(我认为没有 GA 会更容易解决),但正如您所问,我将提供 2 个答案:

没有 GA: 您应该能够使用深度优先搜索来解决第一个问题,将单词的子字符串与该字典匹配,并使用剩余的单词部分这样做,只接受将单词转换为单词(没有元音),其中所有单词都在第二个字典中。然后你必须替换元音。鉴于第二个字典和您已经拥有的分区,这应该很容易。您还可以使用元音列表来进一步限制分区,因为分区中的有效单词只能使用输入算法的元音列表中的元音组成。从字符串的左侧开始并以深度优先的方式遍历所有有效分区应该相对较快地解决这个问题。

使用 GA:为了使用 GA 解决这个问题,我会创建没有元音的单词词典。然后使用 GA,创建与输入的辅音字符串长度相同的二进制字符串(作为您的染色体),其中 1 = 在该位置拆分单词,0 = 保持不变。这些字符串的长度都相同。然后根据该字典创建一个适应度函数,该函数返回使用染色体进行拆分后获得的单词的比例,这些单词是没有元音的有效单词。创建第二个适应度函数,该函数采用有效的非元音词,并计算所有这些有效的非元音词中缺失的元音与原始元音列表之间的重叠比例。通过将第一个值乘以 10 将两个适应度函数合并为一个(假设第二个返回的值介于 0 和 1 之间)。这将迫使算法首先关注分割问题,然后关注元音插入问题,并且还将支持具有相同质量的分割,但更喜欢那些具有更接近原始列表的缺失元音集的分割。我还将在解决方案中包括交叉。因为你所有的染色体都是相同的长度,这应该是微不足道的。一旦你有一个在适应度函数上得分完美的解决方案,那么在给定没有元音的单词字典的情况下重新创建原始句子应该是微不足道的(假设你维护第二个字典,列出每个非元音单词可能丢失的元音集- 每个都可以有多个,因为一些没有元音的词在删除元音后会是一样的。

【讨论】:

  • 仅由元音组成的单词:a、i、you 等如何解决?
  • 那只需要第一步。作为输入给出的元音列表应该约束适应度函数的第一个其余部分。它们将存在于字典中,但元音列表为空。这些词在英语中也很少。
  • 如果解决方案卡在更可能的单词序列之间进行选择,您可能还需要合并语言模型。然而,这个问题受到了足够的限制,我认为你不需要它。
【解决方案2】:

假设您有几代人,并且您绘制了每一代中最佳样本的成本(我们认为是长句子)。该图在 2-3 代后下降或收敛到特定值(例如让算法运行 10 代)?你能用不同的初始条件(随机序列)多次运行你的算法,看看你有时是否能得到好的结果吗?

根据结果,您可以尝试以下方法(此图表是提高性能的非常好的工具):

1) 如果您的图表一直上下波动太多 - 您有太多突变(例如每个基因的平均交换次数),请尝试减少它。

2) 如果您陷入局部最小值(最佳样本的成本在一段时间后没有太大变化)尝试增加突变或运行几个孤立的种群 (3-4)假设您的算法开始时有 100 个物种,持续了几代。然后选择最好的种群(即更接近全局最小值)并尝试通过变异尽可能地改进它

PS:顺便说一下有趣的问题,我试图弄清楚如何使用交叉来改进算法但没有弄清楚

【讨论】:

    【解决方案3】:

    适应度函数是GA算法成功的关键(我有点同意这里适合)。

    我同意@Simon 的观点,即元音非元音分离并不那么重要。只需跳动您的文本语料库即可删除元音。

    什么对健身很重要:

    1. 匹配词频(常用词更好)
    2. 语法 - 句子的结构(您可能需要使用 NLTK 来获取相关信息)

    别忘了更新最终结果^^

    【讨论】:

      猜你喜欢
      • 2019-12-26
      • 2015-11-10
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多