⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 moea.m

📁 本例程解决了一个两个目标的优化问题
💻 M
字号:
%一个多目标优化算法的M文件
%定义遗传算法的参数
NIND=50;  %种群规模
MAXGEN=50; %算法的最大迭代次数
PRECI=20;  %变量二进制位数
NVAR=2; %变量维数
GGAP=0.8; %代沟
%定义算法性能跟踪器
trace1=[];
trace2=[];
trace3=[];
%定义区域描述器
FieldD=[rep([PRECI],[1,NVAR]);[1,1;4,2];rep([1;0;1;1],[1,NVAR])];
Chrom=crtbp(NIND,NVAR*PRECI); %产生初始种群,个体数目为50,每个个体染色体长度为40位二进制串
v=bs2rv(Chrom,FieldD);%初始种群的十进制转换
gen=1;%代计数器赋值
while gen<MAXGEN
     ObjV1=f1(v(1:NIND/2,:));  %分组后第一目标函数值,计算向量v中前面1到25个个体(NIND/2)
     FitnV1=ranking(ObjV1); %为向量v中前面1到25个个体根据其目标函数值进行赋值
    SelCh1=select('sus',Chrom(1:NIND/2,:),FitnV1,GGAP);%在原始种群Chrom中对前面1到25(NIND/2)个个体中进行基于适应度函数值FitnV1进行随机遍历选择,复制的代沟为0.9
    ObjV2=f2(v(NIND/2+1:NIND,:));%分组后第二目标函数值,计算向量v中第26至50个个体的目标函数值
    FitnV2=ranking(ObjV2);%为向量v中第26至50个个体依据目标函数值赋值
    SelCh2=select('sus',Chrom(NIND/2+1:NIND,:),FitnV2,GGAP);%在原始种群Chrom中对第26至50个个体进行基于适应度值FitnV2进行随机遍历选择,复制的代沟为0.9,(25*0.9=22.50)
    ObjV=[ObjV1;ObjV2];%合并目标向量ObjV1和ObjV2,ObjV1中25个值,ObjV2中25个值,因此,ObjV中一共有50个值(即ObjV中有50行)
     SelCh=[SelCh1;SelCh2]; %合并子个体,SelCh1是依据f1进行的代沟为0.9,而且是从原始种群的前面半部分选择来的,SelCh2是依据f2进行的代沟为0.9,而且是从原始种群的后半部分选择出来,SelCh中的个体数目应该只有NIND*GGAP个个体
    SelCh=recombin('xovsp',SelCh,0.7); %对SelCh进行重组
    SelCh=mut(SelCh);%对SelCh进行变异
    v=bs2rv(SelCh,FieldD);%对合并后的子群体SelCh进行十进制的转化
     ObjVSel1=f1(v(1:NIND/2*GGAP,:));%对v中前面的1到NIND/2*GGAP个个体依据函数f1计算目标函数值,注意(NIND/2*GGA)要求是一个整数,否则会出错
    ObjVSel2=f2(v(NIND/2*GGAP+1:NIND*GGAP,:));%对v中后面的(NIND/2*GGAP+1)个个体值(NIND*GGAP)个个体依据函数f2计算目标函数值,要求行,列的序号一定为正整数
     ObjVSel=[ObjVSel1;ObjVSel2]; %合并子个体的目标函数值,注意,ObjVSel的行数应该只有NIND*GGAP行
    [Chrom ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %对原始种群Chrom进行重插入,亦即用SelCh值(NIND*GGAP)个个体采用基于适应度值的方式替换Chrom最不适应的个体,注意ObjV的行数是NIND,而ObjVSel的行数是NIND*GGAP 
    v=bs2rv(Chrom,FieldD);%进行重插入后对新种群Chrom进行十进制转换
    trace1(gen,1)=min(f1(v));
   trace1(gen,2)=sum(f1(v))/length(f1(v));
    trace2(gen,1)=min(f2(v));
    trace2(gen,2)=sum(f2(v))/length(f2(v));
   trace3(gen,1)=min(f1(v)+f2(v));
   trace3(gen,2)=sum(f1(v))/length(f1(v))+sum(f2(v))/length(f2(v));
  gen=gen+1;
end
    figure(1);
    plot(trace1(:,1));
    hold on;
    plot(trace1(:,2),'-.'),title('第一目标函数性能分布图');
    grid;
    plot(trace1(:,1),'.');
    plot(trace1(:,2),'.');
    legend('解的变化','种群均值的变化');
    xlabel('迭代次数');ylabel('第一目标函数值');
    figure(2);
    plot(trace2(:,1));
    hold on;
    plot(trace2(:,2),'-.'),title('第二目标函数性能分布图');
    grid;
    plot(trace2(:,1),'.');
    plot(trace2(:,2),'.');
    legend('解的变化','种群均值的变化');
    xlabel('迭代次数');
    ylabel(' 第二目标函数值');
    figure(3);
    plot(trace3(:,1));
    hold on;
    plot(trace3(:,2),'-.'),title('加权多目标函数性能分布图');
    grid;
    plot(trace3(:,1),'.');
    plot(trace3(:,2),'.');
    figure(4);
    plot(f1(v));
    hold on;
    plot(f2(v),'r-.');
    grid;
    title('算法终止函数f1和f2的目标值分布');
    

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -