1

我想编写一个遗传算法来解码用替换密码编码的字符串。输入将是一串从 a 到 z 的小写字符和空格字符,它们不会被编码。例如,

uyd zjglk brsmh osc tjewn spdr uyd xqia fsv

是一个有效的编码

the quick brown fox jumps over the lazy dog

请注意,空格字符不会被编码。

基因将是一对一的随机字符映射。

为了确定基因(或映射)的适应度,将要解码的字符串应用于此映射,并计算结果中识别的英语单词的数量。

当输入字符串中的所有单词都是有效的英文单词时,算法终止。

我不想使用其他技术,例如频率分析。

这行得通吗?关于性能可以说什么?

4

3 回答 3

3

计算有效词的数量给出了一个非常“高原-y”的适应度景观。

在您的示例字符串中,每个人都将被分配一个介于 0 和 9 之间(含)的整体适应度值,其中绝大多数处于该范围的低端。这意味着如果你生成一个初始种群,很可能所有这些种群的适应度都为零。这意味着你不能有有意义的选择压力,整个事情看起来很像随机游走。你偶尔会偶然发现一些正确的词,那时,人们会转向那个人。

如果有足够的时间,(假设你的单词足够短,有希望偶尔随机找到一个),你最终会找到字符串。如果您让遗传算法在超指数时间领域运行得足够远,那么具有明智(即遍历)运算符的遗传算法将始终找到最佳解决方案。但是,GA 不太可能是解决问题的方法。

于 2013-07-29T13:35:03.520 回答
3

遗传算法通常具有“重组”和“突变”,以从前一个生成新一代。您可能需要考虑这一点 - 如果您这一代中有两个特定的替换密码,并且当您查看它们中创建英语单词的部分时,可能会将创建英语的两个密码的非冲突部分结合​​起来单词,并创建一个比您“配对”的两个原始密码中的任何一个都产生更多英语单词的密码。如果你不这样做,那么遗传算法可能需要更长的时间。

此外,您可能希望将您对“健身”功能的选择更改为比密码产生多少个英语单词更复杂的东西。直观地说,如果有一个相当长的加密词(比如 5 个或更多字母)并且有一些重复的字母,那么如果你成功地将它翻译成一个英文词,通常可能更好的证据表明这部分密码是正确的,而不是如果您有两个或三个不同的 2 字母单词可以翻译成英语。

至于“它会起作用/性能如何”,我同意普遍的共识,即您的遗传算法基本上是一种进行随机猜测的结构化方法,并且最初可能通常很难确保您的适合人群有一些在正确解决方案方面取得良好进展的个人,仅仅是因为可能有许多密码给出了不正确的英文单词,例如,如果你有很多 3 个字母的单词和 3 个不同的字母。所以你要么需要一个巨大的人口规模(至少在开始时),要么如果你确定你的人口没有变得更健康,你将不得不重新启动算法(因为他们都被困在给出适度的局部最优值附近英语单词的数量,但它们完全偏离了正确的解决方案)。

于 2013-07-29T14:19:00.750 回答
2

对于遗传算法,您需要一种获得下一代的方法。要么您发明某种方法将两种排列组合成第三种排列,要么您只是对最成功的排列进行随机修改。后者基本上为您提供了基于随机游走的局部搜索算法,该算法在时间方面效率不高,但可能会收敛。
前者根本不会有任何好处。对于不同的排列,即使它们不共享一个正确的字母对,您也可能会得到非零字数。简而言之,替代密码过于非线性,以至于您的算法变成了一系列随机猜测,类似于 bogosort。您可能评估的不是多个单词,而是诸如字母链的“可能性”之类的东西,但这几乎是一种频率分析。

于 2013-07-29T05:40:36.947 回答