• GA算法及参数对结果的影响


    1.遗传算法简介

     遗传算法是一种基于自然选择和群体遗传机理的搜索算法,它模拟了自然选择和自然遗传过程中的繁殖、杂交和突变现象.再利用遗传算法求解问题时,问题的每一个可能解都被编码成一个“染色体”,即个体,若干个个体构成了群体(所有可能解).在遗传算法开始时,总是随机的产生一些个体(即初始解),根据预定的目标函数对每一个个体进行评估,给出一个适应度值,基于此适应度值,选择一些个体用来产生下一代,选择操作体现了“适者生存”的原理,“好”的个体被用来产生下一代,“坏”的个体则被淘汰,然后选择出来的个体,经过交叉和变异算子进行再组合生成新的一代,这一代的个体由于继承了上一代的一些优良性状,因而在性能上要优于上一代,这样逐步朝着最优解的方向进化.因此,遗传算法可以看成是一个由可行解组成的群体初步进化的过程.
    2.遗传算法原理简析

        2.1.GA算法是一种元启发式自然选择的过程 ,遗传算法通常是利用生物启发算子,如变异、交叉和选择来生成高质量的优化和搜索问题的解决方案。

        借鉴生物进化理论,遗传算法将问题模拟成一个生物进化过程,通过遗传、交叉、突变、自然选择等操作产生下一代的解,并逐步淘汰适应度函数值低的解,增加适应度函数高的解。这样进化N代后就很有      可能会进化出适应度函数值很高的个体。

    2.2.遗传算法的基本术语

        个体:可行解

        种群:可行解集

        染色体:可行解的编码

        基因:可行解的分量

        基因形式:遗传编码

        适应度:适应度函数(评价的值)

        选择:选择操作

        交叉:编码的交叉操作

        变异:可行解码的变异

    3.遗传算法的基本操作

      遗传算法的操作即模拟生物基因操作:优选适应性强的个体的“选择”;个体间交换基因产生新个体的“交叉”;个体间的基因突变而产生新个体的“变异”。 

       3.1选择

        选择是指从群体中选择优良个体并淘汰劣质个体的操作.它建立在适应度评估的基础上.适应度越大的个体,被选中上的可能性就越大,他的“子孙”在下一代中的个数就越多,选择出来的个体就被放入配对库中.目前常用的选择方法有轮赌盘方法、最佳个体保留法、期望值法、排序选择法、竞争法、线性标准化法.

       3.2交叉

        交叉就是指把两个父代个体的部分结构加以替换重组而生成新的个体的操作,交叉的目的是为了在下一代产生新的个体,通过交叉操作,遗传算法的搜索能力得到了飞跃性的提高.交叉是遗传算法获取优良个体的重要手段.交叉操作是按照一定的交叉概率在匹配库中随机的选取两个个体进行的,交叉位置也是随机的,交叉概率一般取得很大,为0.6~0.9.
       3.3变异

        变异就是以很小的变异概率Pm随机地改变种群中个体的某些基因的值,变异操作的基本过程是:产生一个[0,1]之间的随机数rand,如果rand<Pm,则进行变异操作.变异操作本身是一种局部随机搜索,与选择、交叉算子结合在一起,能够避免由于选择和交叉算子而引起的某些信息永久性丢失,保证了遗传算法的有效性,使遗传算法具有了局部随机搜索能力,同时使得遗传算法能够保持群体的多样性,以防出现未成熟收敛.在变异操作中,变异概率不宜取得过大,如果Pm>0.5,遗传算法就退化为了随机搜索.

    4.遗传算法的操作步骤

           开始循环直至找到满意的解。

    1.评估每条染色体所对应个体的适应度。

    2.遵照适应度越高,选择概率越大的原则,从种群中选择两个个体作为父方和母方。

    3.抽取父母双方的染色体,进行交叉,产生子代。

    4.对子代的染色体进行变异。

    5.重复2,3,4步骤,直到新种群的产生

             结束循环

    5.遗传算法的实现

    以遗传算法解决tsp问题为例探索参数对结果的影响

    流程图

    主函数

    %main
    clear;
    clc;
    %%%%%%%%%%%%%%%输入参数%%%%%%%%

    M=100; %%种群的个数
    ITER=2000; %%迭代次数
    %C_old=C;
    m=2; %%适应值归一化淘汰加速指数
    Pc=0.8; %%交叉概率
    Pmutation=0.05; %%变异概率
    %%导入城市的坐标
    %%pos=randn(N,2);
    load citys_data.mat

    %%生成城市之间距离矩阵

    N = size(citys,1);
    D = zeros(N,N);
    for i = 1:N
    for j = 1:N
    if i ~= j
    D(i,j) = sqrt(sum((citys(i,:) - citys(j,:)).^2));
    else
    D(i,j) = 1e-4;
    end
    end
    end
    %%生成初始群体

    popm=zeros(M,N);
    for i=1:M
    popm(i,:)=randperm(N);%随机排列,比如[2 4 5 6 1 3]
    end
    %%随机选择一个种群
    R=popm(1,:);
    figure(1);
    scatter(citys(:,1),citys(:,2),'rx');%画出所有城市坐标
    axis([-3 3 -3 3]);
    figure(2);
    plot_route(citys,R); %%画出初始种群对应各城市之间的连线
    axis([-3 3 -3 3]);
    %%初始化种群及其适应函数
    fitness=zeros(M,1);
    len=zeros(M,1);

    for i=1:M%计算每个染色体对应的总长度
    len(i,1)=myLength(D,popm(i,:));
    end
    maxlen=max(len);%最大回路
    minlen=min(len);%最小回路

    fitness=fit(len,m,maxlen,minlen);
    rr=find(len==minlen);%找到最小值的下标,赋值为rr
    R=popm(rr(1,1),:);%提取该染色体,赋值为R
    for i=1:N
    fprintf('%d ',R(i));%把R顺序打印出来
    end
    fprintf(' ');

    fitness=fitness/sum(fitness);
    distance_min=zeros(ITER+1,1); %%各次迭代的最小的种群的路径总长
    nn=M;
    iter=0;
    while iter<=ITER
    fprintf('迭代第%d次 ',iter);
    %%选择操作
    p=fitness./sum(fitness);
    q=cumsum(p);%累加
    for i=1:(M-1)
    len_1(i,1)=myLength(D,popm(i,:));
    r=rand;
    tmp=find(r<=q);
    popm_sel(i,:)=popm(tmp(1),:);
    end
    [fmax,indmax]=max(fitness);%求当代最佳个体
    popm_sel(M,:)=popm(indmax,:);

    %%交叉操作
    nnper=randperm(M);
    % A=popm_sel(nnper(1),:);
    % B=popm_sel(nnper(2),:);
    %%
    for i=1:M*Pc*0.5
    A=popm_sel(nnper(i),:);
    B=popm_sel(nnper(i+1),:);
    [A,B]=cross(A,B);
    % popm_sel(nnper(1),:)=A;
    % popm_sel(nnper(2),:)=B;
    popm_sel(nnper(i),:)=A;
    popm_sel(nnper(i+1),:)=B;
    end

    %%变异操作
    for i=1:M
    pick=rand;
    while pick==0
    pick=rand;
    end
    if pick<=Pmutation
    popm_sel(i,:)=Mutation(popm_sel(i,:));
    end
    end

    %%求适应度函数
    NN=size(popm_sel,1);
    len=zeros(NN,1);
    for i=1:NN
    len(i,1)=myLength(D,popm_sel(i,:));
    end

    maxlen=max(len);
    minlen=min(len);
    distance_min(iter+1,1)=minlen;
    fitness=fit(len,m,maxlen,minlen);
    rr=find(len==minlen);
    fprintf('minlen=%d ',minlen);
    R=popm_sel(rr(1,1),:);
    for i=1:N
    fprintf('%d ',R(i));
    end
    fprintf(' ');
    popm=[];
    popm=popm_sel;
    iter=iter+1;
    %pause(1);

    end
    %end of while

    figure(3)
    plot_route(citys,R);
    axis([-3 3 -3 3]);
    figure(4)
    plot(distance_min);

    运行结果:

     

     

     (1) 导入的城市坐标    (2)初始种群对应各城市之间的连线  (3)适应度最高解 (4)收敛曲线图   

      5.1  种群规模M对结果的影响

            当M=30时,运行结果

    由结果可知  结果路径长度比原来加长,迭代次数也增加

             当M=500时,运行结果

    由结果可知   路径长度和原来相差不大,但迭代次数很不稳定

     5.2 迭代次数ITER对结果的影响

         当ITER=200时,运行结果

    由结果可知,迭代次数过小  曲线不能达到收敛

           当ITER=10000时,运行结果

     由结果可知   迭代次数太大  种群过早成熟  提前收敛 

       5.3变异概率Pmutation对结果的影响

              当Pmutation=0.005时,运行结果

     由结果可知     种群的多样性下降太快, 收敛不稳定

         当Pmutation=5时,运行结果

      由结果可知   种群多样性过于充足会导致结果收敛不稳定起伏幅度很大

      5.4交叉概率Pc对结果的影响

          当Pc=0.01时,运行结果

     由结果可知  迭代900次左右曲线收敛

       当Pc=2时,运行结果

    由结果可知  曲线在迭代到五百次左右将趋于稳定时  又重新寻找新的最适应解

    6.总结

    ①种群的规模:群体规模太小,很明显会出现近亲交配,产生病态基因。使得种群进化不能按照模式定理产生所预期的期望数量;群体规模太大,结果难以收敛且浪费资源,稳定性下降。

    ②迭代次数:进化代数太小,种群进化不成熟,不容易收敛;进化代数太大,种群进化过于早熟不可能再收敛,继续进化没有意义,只会增加时间开支和资源浪费。

    ③变异概率:变异概率太小,种群的多样性下降太快,容易导致 收敛不稳定;变异概率太大,尽管种群的多样性可以得到保证,但是最适应解的概率也随之增大。

    ④交叉概率:交叉概率太小,种群不能有效更新,导致收敛结果不具说服性;交叉概率太大,与变异概率类似,容易破坏已有的最适应解,随机性增大,容易错失最优个体。

    7.遗传算法的特点

    ①遗传算法是对参数的编码进行操作,而非对参数本身。

    ②遗传算法是从许多点开始并行操作,并非局限于一点,从而可有效防止搜索过程收敛于局部最优解。

    ③遗传算法通过目标函数计算适值,并不需要其它推导和附加信息,因而对问题的依赖性较小。

    ④遗传算法的寻优规则是由概率决定的,而非确定性的。

    ⑤遗传算法在解空间进行高效启发式搜索,而非盲目地穷举或完全随机搜索。

    ⑥遗传算法对所求解的优化问题没有太多的数学要求。

    ⑦遗传算法具有并行计算的特点,因而可通过大规模并行计算来提高计算速度

     8.总结

    遗传算法和蚁群算法都是有效的最优化搜索算法,在解决TSP这类组合优化问题时,它们各有优缺点。蚁群算法是通过信息素的累积和更新而收敛于最优路径,但初期信息素匮乏、导致算法速度慢。遗传算法具有快速全局搜索能力,但没有能够及时利用网络的反馈信息,故算法的搜索速度比较慢,往往导致无为的冗余迭代,存在收敛速度慢、算法运算量较大的缺点 。

     本文参考:

    https://blog.csdn.net/sinat_38321889/article/details/79001599?tdsourcetag=s_pctim_aiomsg

  • 相关阅读:
    工具资源系列之给 windows 虚拟机装个 mac
    工具资源系列之 github 上各式各样的小徽章从何而来?
    php 学习笔记之日期时间操作一箩筐
    2018-12-03 VS Code英汉词典插件v0.0.7-尝试词性搭配
    2018-11-29 VS Code英汉词典插件v0.0.6-改为TS实现, 加测试
    2018-11-27 中文代码示例之Programming in Scala笔记第七八章
    2018-11-23 手工翻译Vue.js源码:尝试重命名标识符与文本
    2018-11-21 手工翻译Vue.js源码第一步:14个文件重命名
    2018-11-16 中文代码示例之Programming in Scala笔记第四五六章
    2018-11-13 中文代码示例之Programming in Scala学习笔记第二三章
  • 原文地址:https://www.cnblogs.com/lhx0814/p/11889899.html
Copyright © 2020-2023  润新知