我想写一个遗传算法来解码一个用替换密码编码的字符串。输入将是从a到z的小写字符和空格字符的字符串,这些字符不会被编码。例如,
uyd zjglk brsmh osc tjewn spdr uyd xqia fsv
的有效编码。
the quick brown fox jumps over the lazy dog
注意,空格字符不会被编码。
基因将是一对一的随机字符映射。
为了确定一个基因的(或映射的)适应度,将需要解码的字符串应用到此映射中,并计算结果中可识别的英语单词的数量。
当输入字符串中的所有单词都是有效的英语单词时,该算法将终止。
我不想使用其他技术,例如频率分析。
这个能行吗?关于性能有什么可说的呢?
发布于 2013-07-29 13:35:03
计算有效单词的数量会给出一个非常“高原-y”的适合的景象。
在您的示例字符串中,每个个体都将被分配一个介于0到9之间的整体适应度值(包括在内),其中绝大多数位于该范围的低端。这意味着,如果你生成一个初始种群,很可能所有的人都有一个零的健康度。这意味着你不可能有意义的选择压力,整个事情看起来很像一个随机漫步。你偶尔会偶然发现一个词正确的东西,在那个时候,人群会转向那个人。
如果有足够的时间(假设你的话足够短,有希望每隔一段时间随机查找一条),你最终会找到字符串。如果你让遗传算法在超指数时间的土地上跑得足够远的话,有了合理(即遍历)算子的遗传算法总是能找到最优解。然而,GA不太可能是解决问题的好方法。
发布于 2013-07-29 14:19:00
遗传算法通常有“重组”和“突变”,以从上一代产生新的一代。你可能想考虑这一点--如果你这一代有两个特定的替换密码,当你观察它们中创造英语单词的部分时,也许可以将两个创造英语单词的密码中不冲突的部分结合起来,并制造一个比你“匹配”的两个原始密码中的任何一个产生更多英语单词的密码。如果你不这样做,那么遗传算法可能需要更长的时间。
另外,你可能想要改变你对“适合度”函数的选择,使之比简单的密码产生多少个英语单词更复杂。直觉地说,如果有一个加密的单词相当长(比如说5个或更多的字母),并且有一些重复的字母,那么如果你成功地将这个单词翻译成一个英文单词,那么通常情况下,这部分密码是正确的,而不是如果你有两个或三个不同的两个字母的单词翻译成英语。
至于“它是否有效/性能如何”,我同意普遍的共识,即你的遗传算法基本上是一种随机猜测的结构化方式,一开始,很可能很难确保你的群体中有一些人正在朝着正确的解决方案取得良好的进展,仅仅是因为有很多密码会给出不正确的英语单词,例如,如果你有很多字母不同的字母的话。所以你要么需要一个庞大的人口规模(至少在一开始是这样),要么你必须重新启动算法,如果你确定你的种群没有变好(因为他们都被困在局部擎天柱附近,给出了适度数量的英语单词,但它们完全偏离了正确的解决方案)。
发布于 2013-07-29 05:40:36
对于遗传算法,你需要一个方法来获得下一代。要么你发明了将两个排列交叉成第三个排列的方法,要么你只是随机地修改了大多数成功的排列。后者本质上给出了基于随机游走的局部搜索算法,这在时间上并不太有效,但是可以收敛。
前者一点好处也没有。对于不同的排列,即使它们没有共享一个正确的字母对,也可能得到非零字数。简而言之,替换密码太非线性了,所以你的算法变成了一系列随机猜测,比如bogosort。你可以评估的不是一些单词,而是类似于字母链的“可能性”,但这将是一种频率分析。
https://stackoverflow.com/questions/17913300
复制相似问题