创建我的第一个算法

时间:2011-04-17 11:45:22

标签: c# algorithm genetic-algorithm biological-neural-network

嘿伙计们再次为我自己做了一个全新的项目。在我之前的帖子中,我习惯于编程来完成某些工作很容易使用,但现在我想看看在编写更有创意的东西时可以做些什么。

所以我将问一系列与算法相关的问题。没有史酷比他们真正的是什么或如何写一个。但我感兴趣的是GA(遗传算法)。

我已经打破了我将要尝试和实现的目标,但我需要一个起点和一些编程(控制台c#)来帮我上路并以编程方式思考。希望你喜欢阅读,并可以帮助我。

所有生物都由细胞组成。在每个细胞中都有相同的染色体组。染色体是DNA串,可作为整个生物体的模型。染色体由基因,DNA块组成。每个基因编码特定的蛋白质。基本上可以说,每个基因编码一种特征,例如眼睛的颜色。特征的可能设置(例如蓝色,棕色)称为等位基因。每个基因在染色体中都有自己的位置。这个位置叫做locus。

完整的遗传物质(所有染色体)称为基因组。基因组中特定的一组基因称为基因型。基因型是出生后基因型,有机体的表型,其身体和心理特征,如眼睛的颜色,智力等。

基本遗传算法概述

  1. [开始] 生成n条染色体的随机群体(问题的合适解决方案)
  2. [健身] 评估人口中每条染色体x的适合度f(x)
  3. [新人口] 通过重复以下步骤创建新人口,直到新人口完成      1. [选择] 根据群体的适合度从群体中选择两个父染色体(更好的适应性,更大的选择机会)      2. [Crossover] 以交叉概率跨越父母以形成新的后代(孩子)。如果没有进行交叉,后代就是父母的精确副本。      3. [突变] 突变概率突变每个基因座(染色体中的位置)的新后代。      4. [接受]将新的后代置于新的人群中
  4. [替换] 使用新生成的人口进行进一步的算法运算
  5. [测试] 如果满足结束条件,请停止并返回当前人口中的最佳解决方案
  6. [循环] 转到第2步
  7. 染色体编码

    染色体应该以某种方式包含它所代表的解决方案的信息。最常用的编码方式是二进制字符串。然后染色体看起来像这样:

    Chromosome 1    1101100100110110
    Chromosome 2    1101111000011110
    

    每条染色体都有一个二进制字符串。此字符串中的每个位都可以表示解决方案的某些特征。或者整个字符串可以表示一个数字 - 这已在基本的GA小程序中使用。

    当然,还有很多其他编码方式。这主要取决于解决的问题。例如,可以直接编码整数或实数,有时对某些排列等进行编码很有用。

    交叉

    在我们确定了将使用的编码之后,我们可以迈出跨越的一步。 Crossover从父染色体中选择基因并创造新的后代。如何做到这一点最简单的方法是随机选择一些交叉点和此点之前的所有内容,从第一个父节点复制,然后从第二个父节点复制交叉点之后的所有内容。

    Crossover可以看起来像这样(|是交叉点):

    Chromosome 1    11011 | 00100110110
    Chromosome 2    11011 | 11000011110
    Offspring 1     11011 | 11000011110
    Offspring 2     11011 | 00100110110
    

    还有其他方法可以进行交叉,例如我们可以选择更多的交叉点。交叉可能相当复杂,并且非常依赖于染色体编码的编码。针对特定问题进行的特定交叉可以提高遗传算法的性能。

    突变

    在执行交叉之后,发生突变。这是为了防止人口中的所有解决方案陷入解决问题的局部最优。突变会随机改变新的后代。对于二进制编码,我们可以将一些随机选择的位从1切换为0或从0切换为1.然后可以进行变异:

    Original offspring 1    1101111000011110
    Original offspring 2    1101100100110110
    Mutated offspring 1     1100111000011110
    Mutated offspring 2     1101101100110110
    

    突变取决于编码和交叉。例如,当我们编码排列时,突变可以交换两个基因。

1 个答案:

答案 0 :(得分:2)

看看你的解释。

  

基本遗传算法概述

     
      
  1. [开始] 生成n条染色体的随机群体(问题的合适解决方案)
  2.   
  3. [健身] 评估人口中每条染色体x的适合度f(x)
  4.   
  5. [新人口] 通过重复以下步骤创建新人口,直到新人口完成   
        
    1. [选择] 根据群体的适合度选择两个父类染色体(适应度越高,选择的机会越大)
    2.   
    3. [Crossover] 以交叉概率跨越父母以形成新的后代(儿童)。如果没有进行交叉,后代就是父母的精确副本。
    4.   
    5. [突变] 突变概率突变每个基因座(染色体中的位置)的新后代。
    6.   
    7. [接受] 将新后代置于新人群中
    8.   
  6.   
  7. [替换] 使用新生成的人口进行进一步的算法运算
  8.   
  9. [测试] 如果满足结束条件,请停止并返回当前人口中的最佳解决方案
  10.   
  11. [循环] 转到第2步
  12.   

这看起来非常像一个程序。如果你把它转换成代码,你应该大约95%。您将缺少的是“健身功能”,它基本上是解决方案的运行+成功的标准。每个问题都有所不同,所以我们在那里帮不了多少。但它的作用很可能是将染色体的位用作标记或操作码,具体取决于问题的复杂程度,并查看染色体是否以及有多快(即:当前位/字节/标记组合/ opcodes / whatever)解决了这个问题。