用遗传算法解决多元函数的优化问题

opt_minmax=1;%目标优化类型;1最大化、-1最小化

num_ppu=60;   %种群规模;个体个数

num_gen=100;  %遗传最大代数

num_v=2;     %变量个数

len_ch=20;    %基因长度

gap=0.9;      %代沟

sub=-10;      %函数取值下限

up=10;        %函数取值的上限

cd_gray=1;    %为防止汉明悬崖,使用格雷编码;若不使用,则取值为0

sc_log=0;   

trace=zeros(num_gen,2);

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);

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('多元函数优化结果')

holdon

whilek_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_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-*')

holdon

plot(trace(:,2),'b-o')

legend('各子代种群最优解','各子代种群平均值')

xlabel('迭代次数')

ylabel('目标函数优化情况')

title('多元函数优化过程')

functionmy=fun_mutv(x,y)   %多元函数的描述

t1=zeros(size(x));

t2=t1;

fori=1:5

    t1=t1+i*sin((i+1)*x+i);

    t2=t2+i*cos((i+1)*y+i);

end

my=t1.*t2;

end

你可能感兴趣的:(用遗传算法解决多元函数的优化问题)