这是2014年4月在其他博客上写的,转贴到CSDN的博客上。
最近许老师让一位师姐带我看解决多目标规划问题的遗传算法(以下简称多目标GA),在论坛上找到英国sheffield大学开发的一个matlab遗传算法工具箱gatbx,尝试着用了用入个手,先附上根据《Matlab遗传算法工具箱及应用》(雷英杰 等编著,西安电子科技大学出版社)实现的两个GA程序。当然啦,工具箱能够实现的多目标GA问题还在探索之中,不过工具箱的功能肯定是有限的,要想实现比较复杂的算法,可能还是要自己写代码。
1. 简单遗传算法
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%program name:简单遗传算法
%time:2014/04/02
%input:无
%output:最优解的目标函数值、最优解的染色体、遗传算法性能跟踪(用曲线图表示)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
NIND=30; %个体数目(Numbe of individuals)
MAXGEN=30; %最大遗传代数(Maximum number of generations)
NVAR=40; %变量个数
PRECI=1; %变量的二进制位数(Precision of variables)
GGAP=0.9; %代沟(Generation gap)
Chrom=crtbp(NIND, NVAR*PRECI); %创建初始种群
gen=0; %代计数器
for i=1:NIND %计算初始群体中每个个体的目标函数值,目标函数为自己定义的target
ObjV(i,1)=target(Chrom(i,:));
end
while gen
FitnV=ranking(ObjV); %分配适应度值(Assign fitness values)
SelCh=select('sus', Chrom, FitnV, GGAP); %选择:从种群Chrom中选出比例为GGAP的个体
SelCh=recombin('xovsp', SelCh, 0.7); %重组
SelCh=mut(SelCh); %变异
[m n]=size(SelCh);
for i=1:m %计算Selch中每个个体的目标函数值
ObjVSel(i,1)=target(SelCh(i,:));
end
%重插入:基于适应度插入所有子代代替最不适应的父代个体,并且重新计算目标值
[Chrom ObjV]=reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel);
gen=gen+1; %代计数器增加
trace(gen,1)=min(ObjV); %遗传算法性能跟踪,记录每一代的最优解的目标函数值
trace(gen,2)=sum(ObjV)/length(ObjV); %遗传算法性能跟踪,记录每一代的目标函数值均值变化
end
[Result, I]=min(ObjV);
Result %最优解的目标函数值
Chrom(I,:) %输出最优解的染色体
plot(trace(:,1)); %图像表示遗传算法的过程,横坐标是遗传代数,纵坐标是目标函数值
hold on; %画出了每一代最优解的目标函数值变化和平均水平变化
plot(trace(:,2),'-.');
grid;
legend('解的变化','种群均值的变化')
2. 多目标规划问题的遗传算法(并列选择法)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%program name:多目标规划遗传算法(并列选择法)
%time:2014/04/04
%input:无
%output:最优解的目标函数值、最优解的染色体、遗传算法性能跟踪(用曲线图表示)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
NIND=100;
MAXGEN=50;
NVAR=2;
PRECI=20;
GGAP=0.9;
trace1=[];trace2=[];trace3=[]; %性能跟踪
%建立区域描述器(Build field descriptor)
FieldD=[rep([PRECI],[1,NVAR]);[1,1;4,2];rep([1;0;1;1],[1,NVAR])];
Chrom=crtbp(NIND,NVAR*PRECI);
v=bs2rv(Chrom,FieldD); %初始种群十进制转换,v是种群所有个体的表现型向量
gen=1;
while gen
[NIND,N]=size(Chrom); %获取当代种群的个体数目、基因数目
M=fix(NIND/2); %取整,M是分组后第一组的个体数目
ObjV1=myf1(v(1:M,:)); %计算分组后第一组的第一目标函数(自己定义的myf1)的函数值 FitnV1=ranking(ObjV1); %分配适应度
SelCh1=select('sus',Chrom(1:M,:),FitnV1,GGAP); %选择
ObjV2=myf2(v((M+1):NIND,:)); %计算分组后第二组的第二目标函数(自己定义的myf2)的函数值
FitnV2=ranking(ObjV2);
SelCh2=select('sus',Chrom((M+1):NIND,:),FitnV2,GGAP);
SelCh=[SelCh1;SelCh2]; %合并两个组
SelCh=recombin('xovsp',SelCh,0.7); %重组
Chrom=mut(SelCh); %变异
v=bs2rv(Chrom,FieldD);
trace1(gen,1)=min(myf1(v)); %性能跟踪
trace1(gen,2)=sum(myf1(v))/length(myf1(v));
trace2(gen,1)=min(myf2(v));
trace2(gen,2)=sum(myf2(v))/length(myf2(v));
trace3(gen,1)=min(myf1(v)+myf2(v));
trace3(gen,2)=sum(myf1(v))/length(myf1(v))+sum(myf2(v))/length(myf2(v));
gen=gen+1;
end
[Result, I]=min(myf1(v)+myf2(v));
Result %最优解的目标函数值
Chrom(I,:) %输出最优解的染色体
figure(1); %第一目标函数(myf1)的最优解及性能跟踪
plot(trace1(:,1));hold on;plot(trace1(:,2),'-.');
plot(trace1(:,1),'.');plot(trace1(:,2),'.');%描点
grid;legend('解的变化','种群均值的变化')
xlabel('迭代次数');ylabel('目标函数值');
figure(2); %第二目标函数(myf2)的最优解及性能跟踪
plot(trace2(:,1));hold on;plot(trace2(:,2),'-.');
plot(trace2(:,1),'.');plot(trace2(:,2),'.');
grid;legend('解的变化','种群均值的变化')
xlabel('迭代次数');ylabel('目标函数值');
figure(3); %两个目标函数和的最优解及性能跟踪
plot(trace3(:,1));hold on;plot(trace3(:,2),'-.');
plot(trace3(:,1),'.');plot(trace3(:,2),'.');
grid;legend('解的变化','种群均值的变化')
xlabel('迭代次数');ylabel('目标函数值');
figure(4); %最后一代的目标函数值
plot(myf1(v));hold on;plot(myf2(v),'.-.');
grid;legend('第一目标函数值','第二目标函数值');