?? moea.m
字號(hào):
%一個(gè)多目標(biāo)優(yōu)化算法的M文件
%定義遺傳算法的參數(shù)
NIND=50; %種群規(guī)模
MAXGEN=50; %算法的最大迭代次數(shù)
PRECI=20; %變量二進(jìn)制位數(shù)
NVAR=2; %變量維數(shù)
GGAP=0.8; %代溝
%定義算法性能跟蹤器
trace1=[];
trace2=[];
trace3=[];
%定義區(qū)域描述器
FieldD=[rep([PRECI],[1,NVAR]);[1,1;4,2];rep([1;0;1;1],[1,NVAR])];
Chrom=crtbp(NIND,NVAR*PRECI); %產(chǎn)生初始種群,個(gè)體數(shù)目為50,每個(gè)個(gè)體染色體長(zhǎng)度為40位二進(jìn)制串
v=bs2rv(Chrom,FieldD);%初始種群的十進(jìn)制轉(zhuǎn)換
gen=1;%代計(jì)數(shù)器賦值
while gen<MAXGEN
ObjV1=f1(v(1:NIND/2,:)); %分組后第一目標(biāo)函數(shù)值,計(jì)算向量v中前面1到25個(gè)個(gè)體(NIND/2)
FitnV1=ranking(ObjV1); %為向量v中前面1到25個(gè)個(gè)體根據(jù)其目標(biāo)函數(shù)值進(jìn)行賦值
SelCh1=select('sus',Chrom(1:NIND/2,:),FitnV1,GGAP);%在原始種群Chrom中對(duì)前面1到25(NIND/2)個(gè)個(gè)體中進(jìn)行基于適應(yīng)度函數(shù)值FitnV1進(jìn)行隨機(jī)遍歷選擇,復(fù)制的代溝為0.9
ObjV2=f2(v(NIND/2+1:NIND,:));%分組后第二目標(biāo)函數(shù)值,計(jì)算向量v中第26至50個(gè)個(gè)體的目標(biāo)函數(shù)值
FitnV2=ranking(ObjV2);%為向量v中第26至50個(gè)個(gè)體依據(jù)目標(biāo)函數(shù)值賦值
SelCh2=select('sus',Chrom(NIND/2+1:NIND,:),FitnV2,GGAP);%在原始種群Chrom中對(duì)第26至50個(gè)個(gè)體進(jìn)行基于適應(yīng)度值FitnV2進(jìn)行隨機(jī)遍歷選擇,復(fù)制的代溝為0.9,(25*0.9=22.50)
ObjV=[ObjV1;ObjV2];%合并目標(biāo)向量ObjV1和ObjV2,ObjV1中25個(gè)值,ObjV2中25個(gè)值,因此,ObjV中一共有50個(gè)值(即ObjV中有50行)
SelCh=[SelCh1;SelCh2]; %合并子個(gè)體,SelCh1是依據(jù)f1進(jìn)行的代溝為0.9,而且是從原始種群的前面半部分選擇來(lái)的,SelCh2是依據(jù)f2進(jìn)行的代溝為0.9,而且是從原始種群的后半部分選擇出來(lái),SelCh中的個(gè)體數(shù)目應(yīng)該只有NIND*GGAP個(gè)個(gè)體
SelCh=recombin('xovsp',SelCh,0.7); %對(duì)SelCh進(jìn)行重組
SelCh=mut(SelCh);%對(duì)SelCh進(jìn)行變異
v=bs2rv(SelCh,FieldD);%對(duì)合并后的子群體SelCh進(jìn)行十進(jìn)制的轉(zhuǎn)化
ObjVSel1=f1(v(1:NIND/2*GGAP,:));%對(duì)v中前面的1到NIND/2*GGAP個(gè)個(gè)體依據(jù)函數(shù)f1計(jì)算目標(biāo)函數(shù)值,注意(NIND/2*GGA)要求是一個(gè)整數(shù),否則會(huì)出錯(cuò)
ObjVSel2=f2(v(NIND/2*GGAP+1:NIND*GGAP,:));%對(duì)v中后面的(NIND/2*GGAP+1)個(gè)個(gè)體值(NIND*GGAP)個(gè)個(gè)體依據(jù)函數(shù)f2計(jì)算目標(biāo)函數(shù)值,要求行,列的序號(hào)一定為正整數(shù)
ObjVSel=[ObjVSel1;ObjVSel2]; %合并子個(gè)體的目標(biāo)函數(shù)值,注意,ObjVSel的行數(shù)應(yīng)該只有NIND*GGAP行
[Chrom ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %對(duì)原始種群Chrom進(jìn)行重插入,亦即用SelCh值(NIND*GGAP)個(gè)個(gè)體采用基于適應(yīng)度值的方式替換Chrom最不適應(yīng)的個(gè)體,注意ObjV的行數(shù)是NIND,而ObjVSel的行數(shù)是NIND*GGAP
v=bs2rv(Chrom,FieldD);%進(jìn)行重插入后對(duì)新種群Chrom進(jìn)行十進(jìn)制轉(zhuǎn)換
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('第一目標(biāo)函數(shù)性能分布圖');
grid;
plot(trace1(:,1),'.');
plot(trace1(:,2),'.');
legend('解的變化','種群均值的變化');
xlabel('迭代次數(shù)');ylabel('第一目標(biāo)函數(shù)值');
figure(2);
plot(trace2(:,1));
hold on;
plot(trace2(:,2),'-.'),title('第二目標(biāo)函數(shù)性能分布圖');
grid;
plot(trace2(:,1),'.');
plot(trace2(:,2),'.');
legend('解的變化','種群均值的變化');
xlabel('迭代次數(shù)');
ylabel(' 第二目標(biāo)函數(shù)值');
figure(3);
plot(trace3(:,1));
hold on;
plot(trace3(:,2),'-.'),title('加權(quán)多目標(biāo)函數(shù)性能分布圖');
grid;
plot(trace3(:,1),'.');
plot(trace3(:,2),'.');
figure(4);
plot(f1(v));
hold on;
plot(f2(v),'r-.');
grid;
title('算法終止函數(shù)f1和f2的目標(biāo)值分布');
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -