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

    多峰的Shubert为:

      

    求f(x,y)在[-10,10]x[-10,10]上的最大值。

    MATLAB代码:

        fun_mutv函数为:

    function my=fun_mutv(x,y)
    t1=zeros(size(x));
    t2=t1;
    for i=1:5
        t1=t1+i*cos((i+1)*x+i);
        t2=t2+i*cos((i+1)*y+i);
    end
    my=t1.*t2;
    

      

    opt_minmax=1;   %优化目标类型:1最大化 0最小化
    num_ppu=60;     %种群规模,个体个数。
    num_gen=100;    %最大遗传代数
    num_v=2;        %变量个数
    len_ch=20;      %基因长度
    gap=0.9;        %代沟
    sub=-10;        %变量取值下限
    up=10;          %变量取值上限
    cd_gray=1;      %是否选择格雷码编码方式 1是,0否
    sc_log=0;           %是否选择对数标度:1是,0否
    trace=zeros(num_gen,2);     %遗传迭代性能跟踪器
    %区域描述器,rep为矩阵复制函数
    fieldd=[rep([len_ch],[1,num_v]);rep([sub;up],[1,num_v]);rep([1-cd_gray;sc_log;1;1],[1,num_v])];
    chrom=crtbp(num_ppu,len_ch*num_v);  %初始化生产种群
    k_gen=0;
    x=bs2rv(chrom,fieldd);      %翻译初始化种群为10进制
    fun_v=fun_mutv(x(:,1),x(:,2));  %计算目标函数值
    [tx,ty]=meshgrid(-10:1:10); 
    mesh(tx,ty,fun_mutv(tx,ty));
    xlabel('x');ylabel('y');zlabel('z');
    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);    %交叉
        selchtom=mut(selchrom);                         %变异
        x=bs2rv(selchrom,fieldd);                       %子代个体翻译
        fun_v_sel=fun_mutv(x(:,1),x(:,2));              %计算子代个体对应目标函数值
        fit_v_sel=ranking(-opt_minmax*fun_v_sel);       
        [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(id,:),fieldd);
        f=f*opt_minmax;
        fun_v=fun_v*opt_minmax;
        plot3(x(1,1),x(1,2),f,'k*');
        hold on;
        k_gen=k_gen+1;
        trace(k_gen,1)=f;
        trace(k_gen,2)=mean(fun_v);
    end
    figure;
    plot(trace(:,1),'r-*');
    hold on;
    plot(trace(:,2),'b-o');
    legend('各子代种群最优解','各子代种群平均值');
    xlabel('迭代次数');ylabel('目标函数优化情况');
    title('多元函数优化过程');
    

      

  • 相关阅读:
    定时任务(收集)
    命令学习(收集)
    查看进程运行时间
    Linux 中挂载 ISO 文件
    9.已知三边计算三角形的面积公式
    8.输入一个大写字母,要求小写字母输出
    1.输出三个数中的最大值
    2.依次从大到小输出三个数
    3.计算1+2+3+....100=?
    4.计算1*2*3*4........*100=?
  • 原文地址:https://www.cnblogs.com/zxhyxiao/p/9401230.html
Copyright © 2011-2022 走看看