遗传算法(1)

遗传算法也成进化算法,该算法受到达尔文进化论的启发提出的一种启发式搜索算法。

进化论

种群

生物的进化以群体的形式进行,这样的一个群体称为种群。

个体

组成种群的单个生物。

基因

一个遗传因子。

染色体

包含一组的基因。

生存竞争,适者生存

对环境适应度高的个体参与繁殖的机会比较多,后代就会越来越多。适应度低的个体参与繁殖的机会比较少,后代就会越来越少。

遗传与变异

新个体会遗传父母双方各一部分的基因,同时有一定的概率发生基因变异。

综述

繁殖过程,会发生基因交叉,基因突变 ,适应度低的个体会被逐步淘汰,而适应度高的个体会越来越多。那么经过N代的自然选择后,保存下来的个体都是适应度很高的,其中很可能包含史上产生的适应度最高的那个个体。

遗传算法

遗传算法将要解决的问题模拟成一个生物进化的过程,通过复制、交叉、突变等操作产生下一代的解,并逐步淘汰掉适应度函数值低的解,增加适应度函数值高的解。这样进化N代后就很有可能会进化出适应度函数值很高的个体。
下面以0-1背包问题来讲解下遗传算法的步骤

  • 编码
  • 需要将问题的解编码成字符串的形式才能使用遗传算法。最简单的一种编码方式是二进制编码,即将问题的解编码成二进制位数组的形式。例如,问题的解是整数,那么可以将其编码成二进制位数组的形式。将0-1字符串作为0-1背包问题的解就属于二进制编码。

  • 选择
  • 选择一些染色体来产生下一代。一种常用的选择策略是比例选择。也就是轮盘赌算法,如下图所示


    群体中每一染色体指定饼图中一个小块。块的大小与染色体的适应性分数成比例,适应性分数愈高,它在饼图中对应的小块所占面积也愈大。为了选取一个染色体,要做的就是旋转这个轮子,直到轮盘停止时,看指针停止在哪一块上,就选中与它对应的那个染色体。

    若产生随机数为0.81,则6号个体被选中。

    // 轮盘赌代码示意
    /*
    * 按设定的概率,随机选中一个个体
    * P[i]表示第i个个体被选中的概率
    */
    int RWS()
    {
        m =0;
        r =Random(0,1); //r为0至1的随机数
        for(i=1;i<=N; i++)
        {
            /* 产生的随机数在m~m+P[i]间则认为选中了i
             * 因此i被选中的概率是P[i]
             */
            m = m + P[i];
            if(r<=m) return i;
        }
    }
    
  • 交叉
  • 2条染色体交换部分基因,来构造下一代的2条新的染色体。
    父辈染色体
    00000|011100000000|10000
    11100|000001111110|00101
    随机交叉遗传
    00000|000001111110|10000
    11100|011100000000|00101

  • 变异
  • 新产生的染色体中的基因会以一定的概率出错,称为变异。
    变异前: 000001110000000010000
    变异后: 000001110000100010000
    我们认为染色体交叉的概率为Pc,染色体变异的概率为Pm。
    适应度函数:用于评价某个染色体的适应度,用f(x)表示。有时需要区分染色体的适应度函数与问题的目标函数。例如:0-1背包问题的目标函数是所取得物品价值,但将物品价值作为染色体的适应度函数可能并不一定适合。适应度函数与目标函数是正相关的,可对目标函数作一些变形来得到适应度函数。

    欢迎留言

    avatar
      Subscribe  
    Notify of