【搞搞算法】Matlab遗传算法工具箱gatbx小试

这是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('第一目标函数值','第二目标函数值');

    原文作者:遗传算法
    原文地址: https://blog.csdn.net/u010376274/article/details/38689973
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞