zoukankan      html  css  js  c++  java
  • 遗传算法MATLAB实现(2):一元函数优化举例

    遗传算法提供了一种求解非线性、多模型、多目标等复杂系统优化问题的通用框架。

    先从例子开始,慢慢再总结理论。。。

    【例】利用遗传算法计算函数f(x)=x*cos(5*pi*x)+3.5在区间[-1,2.5]上的最大值

    先在工作区建立上面函数的一个m文件并保存,命名为fun_sigv.m:

    function y=fun_sigv(x)
        y=x.*cos(5*pi*x)+3.5;
    

    代沟是父代中需要经过选择、交叉、变异得到下一代的比例,例如父代共100个个体,代沟为0.9,表明有90个个体被选中进行上述一系列操作进化到下一代,剩下10%不变、直接进入下一代,也即下一代还是100个个体。

    tarce是代数*2的二维矩阵,存储各子代种群最优解和各子代种群平均值

    fieldd是区域描述器,有的书中[1]叫译码矩阵。其结构为

      FieldD=[len,lb,ub,code,scale,lbin,ubin]';('代表转置,也就是FieldD是列向量)

      len是每个chrom的长度,lb和ub是行向量,分别指明每个变量使用的下界和上界。

      code是二进制行向量,code(i)=1为标准二进制编码,code(i)=0为格雷码。

      scale是二进制行向量,指明每个子串是否使用对数或算数刻度。0为算数刻度,1为对数刻度。

      lbin和ubin是二进制行向量,指明表示范围中是否包含每个边界。选择lbin=0或ubin=0,从表示范围中去掉边界;lbin=0或ubin=1则表示包含边界。

    fieldd在二进制串到实值转换函数bs2rv中用到:Phen=bs2rv(Chrom,FieldD),即根据译码矩阵FieldD将二进制串矩阵Chrom转换为实值向量。返回矩阵Phen包含对应的种群表现型。对于bs2rv函数,如果使用对数刻度,其范围不能包含零。

    下面是MATLAB代码:

    opt_minmax=1;   %目标优化类型:1最大化、0最小化
    num_ppu=50;     %种群规模即个体个数
    num_gen=60;     %最大遗传代数
    len_ch=20;          %基因长度
    gap=0.9;            %代沟(Generation gap)
    sub=-1;         %变量取值下限
    up=2.5;         %变量取值上限
    cd_gray=1;      %是否选择格雷码编码方式:1是、0否
    sc_log=0;       %是否选择对数标度:1是、0否
    trace=zeros(num_gen,2);     %遗传迭代性能跟踪器
    fieldd=[len_ch;sub;up;1-cd_gray;sc_log;1;1];    %区域描述器
    chrom=crtbp(num_ppu,len_ch);     %初始化生成种群
    k_gen=0;
    x=bs2rv(chrom,fieldd);     %翻译初始化种群为10进制
    fun_v=fun_sigv(x);          %计算目标函数值
    tx=sub:.01:up;                
    plot(tx,fun_sigv(tx));
    xlabel('x');ylabel('y');
    title('一元函数优化结果');
    hold on;
    
    while k_gen<num_gen
        fit_v=ranking(-opt_minmax*fun_v);           %计算目标函数的适应度
        selchrom=select('rws',chrom,fit_v,gap);     %使用轮盘赌方式选择
        selchrom=recombin('xovsp',selchrom);     %交叉
        selchrom=mut(selchrom);                         %变异
        x=bs2rv(selchrom,fieldd);                          %子代个体翻译
        fun_v_sel=fun_sigv(x);                               %计算子代个体对应目标函数值
        [chrom,fun_v]=reins(chrom,selchrom,1,1,opt_minmax*fun_v,opt_minmax*fun_v_sel);%根据目标函数值将子代个体插入新种群
        [f,id]=max(fun_v);                                      %寻找当前种群最优解
        x=bs2rv(chrom,fieldd);                              
        f=f*opt_minmax;
        fun_v=fun_v*opt_minmax;
        k_gen=k_gen+1;
        trace(k_gen,1)=f;
        trace(k_gen,2)=mean(fun_v);
    end
    plot(x(id),f,'r*');
    figure;
    plot(trace(:,1),'r-*');
    hold on;
    plot(trace(:,2),'b-o');
    legend('各子代种群最优解','各子代种群平均值');
    xlabel('迭代次数');ylabel('目标函数优化过程');
    title('一元函数优化过程');
    

      

     求函数f(x)=x*sin(10*pi*x)+2.0,x属于[-1,2]的最大值:

    opt_minmax=1;   %目标优化类型:1最大化、0最小化
    num_ppu=50;     %种群规模即个体个数
    num_gen=25;     %最大遗传代数
    len_ch=20;          %基因长度
    gap=0.9;            %代沟(Generation gap)
    sub=-1;         %变量取值下限
    up=2;         %变量取值上限
    cd_gray=1;      %是否选择格雷码编码方式:1是、0否
    sc_log=0;       %是否选择对数标度:1是、0否
    trace=zeros(num_gen,2);     %遗传迭代性能跟踪器
    fieldd=[len_ch;sub;up;cd_gray;sc_log;1;1];    %区域描述器
    chrom=crtbp(num_ppu,len_ch);     %初始化生成种群
    k_gen=0;
    x=bs2rv(chrom,fieldd);     %翻译初始化种群为10进制
    fun_v=fun_sigv(x);          %计算目标函数值
    tx=sub:.01:up;               
    plot(tx,fun_sigv(tx));
    xlabel('x');ylabel('y');
    title('一元函数优化结果');
    hold on;
     
    while k_gen<num_gen
        fit_v=ranking(-opt_minmax*fun_v);           %计算目标函数的适应度,基于秩/排序的适应度计算。
        selchrom=select('rws',chrom,fit_v,gap);     %使用轮盘赌方式选择
        selchrom=recombin('xovsp',selchrom);     %交叉
        selchrom=mut(selchrom);                         %变异
        x=bs2rv(selchrom,fieldd);                          %子代个体翻译
        fun_v_sel=fun_sigv(x);                               %计算子代个体对应目标函数值
        [chrom,fun_v]=reins(chrom,selchrom,1,1,opt_minmax*fun_v,opt_minmax*fun_v_sel);%根据目标函数值将子代个体插入新种群
        [f,id]=max(fun_v);                                     %寻找当前种群最优解
    %     hold on; 
    %     if id<size(x,1)
    %         plot(x(id),f,'r*');
    %     end
        x=bs2rv(chrom,fieldd);                             
        f=f*opt_minmax;
        fun_v=fun_v*opt_minmax;
        k_gen=k_gen+1;
        trace(k_gen,1)=f;
        trace(k_gen,2)=mean(fun_v);
    end
    
    plot(x',fun_v','b*');
    plot(x(id),f,'rd');
    % hold on;
    % figure;
    % plot(trace(:,1),'r-*');
    % hold on;
    % plot(trace(:,2),'b-o');
    % legend('各子代种群最优解','各子代种群平均值');
    % xlabel('迭代次数');ylabel('目标函数优化过程');
    % title('一元函数优化过程');
    

      

    [1]:雷英杰,张善文,李续武,等. MATLAB遗传算法工具箱及应用. 西安:西安电子科技大学出版社,2005.

  • 相关阅读:
    使用命令行工具创建.Net Core应用程序
    WinForm--DataGridView复制单元格数据
    WinForm--DataGridView导出数据到CSV文件
    进程和线程(线程是轻量级进程)(下)
    进程和线程(线程是轻量级进程)(中)
    C# 泛型(Generic)
    C# 事件(Event)
    C# 委托(Delegate)
    C# 反射
    C# 程序集(Assembly)
  • 原文地址:https://www.cnblogs.com/zxhyxiao/p/9398061.html
Copyright © 2011-2022 走看看