【问题标题】:Genetic Algorithm and Substitution Cipher遗传算法和替换密码
【发布时间】:2013-07-29 22:19:00
【问题描述】:

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

uyd zjglk brsmh osc tjewn spdr uyd xqia fsv

是一个有效的编码

the quick brown fox jumps over the lazy dog

注意空格字符没有被编码。

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

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

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

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

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

【问题讨论】:

  • 好吧,蛮力方法会奏效,但顾名思义,它不会是一种有效的方法。添加频率分析会在实际案例中修剪掉很多额外的脂肪分支,而理论上可以证明有些案例频率分析不会做得更好

标签: algorithm encryption genetic-algorithm


【解决方案1】:

计算有效词的数量可以得出一个非常“平稳”的适应度环境。

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-11
        • 2014-06-08
        • 2013-12-21
        • 2011-04-18
        • 2016-09-16
        相关资源
        最近更新 更多