我想写一个遗传算法来解码用替换密码编码的字符串。输入将是一个由a到z和空格字符组成的小写字符串,不会被编码。例如,
uyd zjglk brsmh osc tjewn spdr uyd xqia fsv
是
的有效编码 the quick brown fox jumps over the lazy dog
请注意,空格字符不会被编码。
基因将是一对一的随机字符映射。
要确定基因(或映射)的适应度,要解码的字符串将应用于此地图,并计算结果中已识别的英语单词数。
当输入字符串中的所有单词都是有效的英语单词时,算法终止。
我不想使用其他技术,例如频率分析。
这会有用吗?关于表现可以说什么?
答案 0 :(得分:3)
计算有效单词的数量会给出非常“稳定”的健身状况。
在您的示例字符串中,将为每个人分配0到9之间的整数适应值,其中绝大多数都在该范围的低端。这意味着如果您生成初始种群,则可能所有这些种群的适应度均为零。这意味着你不能有有意义的选择压力,整个事情看起来很像随机游走。你偶尔偶然会发现一些正确的话,那时人口就会转向那个人。
如果有足够的时间,(并且假设你的单词很短,以至于偶尔会偶尔找到一个偶数),你最终会找到字符串。具有敏感(即遍历)算子的遗传算法总能找到最佳解决方案,如果你让它们足够远地进入超指数时间的土地。但是,GA不太可能成为解决问题的非常好的方式。
答案 1 :(得分:3)
遗传算法通常具有“重组”以及“突变”以创建前一代的新一代。您可能需要考虑这一点 - 如果您的一代中有两个特定的替换密码,当您查看创建英语单词的部分时,可能会将两个密码的非冲突部分组合在一起创建英语单词,并创建一个密码,创造比你“交配”的两个原始密码中的任何一个更多的英语单词。如果你不这样做,那么遗传算法可能需要更长时间。
此外,您可能希望将“健身”功能的选择更改为比简单密码有多少英语单词更复杂的内容。直觉上,如果有一个加密的单词相当长(比如5个或更多的字母)并且有一些重复的字母,那么如果你成功地将它翻译成英文单词,那么通常可能更好的证据表明密码是正确的,而不是如果你有两个或三个不同的双字母单词翻译成英文。
至于“它会起作用/表现如何”,我同意一般的共识,即你的遗传算法基本上是一种进行随机猜测的结构化方法,并且最初可能很难确保你的人口适合个人有一些人正在朝着正确的解决方案取得良好进展,仅仅因为可能有许多密码会提供不正确的英语单词,例如如果你有很多带有3个不同字母的3个字母的单词。所以你要么需要一个巨大的人口规模(至少在开始时),要么你必须重新启动算法,如果你确定你的人口没有得到任何更健康(因为他们都被困在当地的最佳位置,给予适度英语单词的数量,但它们完全偏离了正确的解决方案。)
答案 2 :(得分:2)
对于遗传算法,您需要一种方法来获得下一代。要么你发明了一些方法来将两个排列交换成第三个排列,要么只是对大多数成功的排列进行随机修改。后者基本上为您提供基于随机游走的局部搜索算法,这在时间上并不太有效,但可能收敛。
前者根本不会有任何好处。对于不同的排列,即使它们不共享一个正确的字母对,也可能得到非零字数。简而言之,替换密码太过非线性,因此您的算法会变成一系列随机猜测,就像bogosort。你可能不会评估很多单词,而是评价字母链的“可能性”,但它几乎就是一种频率分析。