当前位置 博文首页 > S_zhangmin的博客:Matlab智能算法chap1

    S_zhangmin的博客:Matlab智能算法chap1

    作者:[db:作者] 时间:2021-09-19 16:13

    遗传算法找最优解。

    主要思想“物竞天择,适者生存”。

    流程:初始化、适应度生成、适应度评估、选择、交叉、变异。

    举例:

    求最大值。

    %f(x,y)= y.*x.*cos(2*pi.*x)+x.*sin(2.*pi.*y),x∈[-2,2],y∈[-1,1]
    clc
    clear 
    % 画出函数图像
    figure(1);
        %给出定义域
    lbx = -2;ubx = 2;
    lby = -1;uby = 1;
    %多元函数使用ezmesh作图,ezmesh('函数',定义域,参数)
    ezmesh('y.*x.*cos(2*pi.*x)+x.*sin(2.*pi.*y)',[lbx,ubx,lby,uby],50); 
    hold on;
    %定义遗传算法参数
    NIND = 40;%种群大小,通常设为40.
    MAXGEN = 500;%最大遗传代数,即循环500次
    PRECI = 20;%个体长度设为20,这里是两个自变量,种群个数为2.
    GGAP = 0.95;%代沟
    px = 0.7;%交叉概率
    pm = 0.01;%变异概率
    trace = zeros(3,MAXGEN); %追踪记录
    FieldD = [PRECI PRECI;lbx lby;ubx uby;1 1;0 0;1 1;1 1];%这里7个参数,转化的格式
    %第一个种群长度,因为有2个自变量,所以写两个,多个自变量类比
    %第二个左边界值
    %第三个右边界值
    %编码方式,有0,1,1代表二进制,0为格雷编码,通常为二进制编码
    %刻度,有0,1,0为算数刻度,1为对数刻度,通常为算数刻度
    %第六个是否包含左边界
    %第七个是否包含右边界
    Chrom = crtbp(NIND,PRECI*2);%初始化种群
    %优化
    gen = 0;%计数器
    XY = bs2rv(Chrom,FieldD);%转化为十进制,
    X=XY(:,1);Y=XY(:,2);
    ObjV=Y.*X.*cos(2*pi.*X)+X.*sin(2.*pi.*Y);
    while gen<MAXGEN
        FitnV = ranking(-ObjV);%分配适应度,这里注意ranking函数是计算最小值并排序,所以这里取负号。
        SelCh = select('sus',Chrom,FitnV,GGAP);%选择
        SelCh = recombin('xovsp',SelCh,px);%重组
        SelCh = mut(SelCh,pm);%变异
        XY = bs2rv(SelCh,FieldD);%转十进制
        X = XY(:,1);Y = XY(:,2);
        ObjVSel = Y.*X.*cos(2*pi.*X)+X.*sin(2.*pi.*Y);
        [Chrom,ObjV] = reins(Chrom,SelCh,1,1,ObjV,ObjVSel);%重插入子代到父代;
        XY = bs2rv(Chrom,FieldD);
        gen = gen+1;
        %获取每代的最优解及其序号,Y为最优解,I为个体的序号。
        [Y,I] = max(ObjV);
        trace(1:2,gen) = XY(I,:);
        trace(3,gen) = Y;
    end
    plot3(trace(1,:),trace(2,:),trace(3,:),'bo');
    grid on;
    plot3(XY(:,1),XY(:,2),ObjV,'bo');
    hold off;
    %画进化图
    figure(2);
    plot(1:MAXGEN,trace(3,:));
    grid on
    xlabel('遗传代数')
    ylabel('解的变化')
    title('进化过程')
    bestZ = trace(3,end);
    bestX = trace(1,end);
    bestY = trace(2,end);
    fprintf(['最优解:\nX = ',num2str(bestX),'\nY=',num2str(bestY),'\nZ =  ',num2str(bestZ),'\n'])
    

    cs
    下一篇:没有了