資源簡(jiǎn)介
遺傳算法求解多目標(biāo)問題,其中將多目標(biāo)問題轉(zhuǎn)化為加權(quán)的單目標(biāo)問題
代碼片段和文件信息
function?[XpLC1LC2LC3LC4]=MYGA(MNPm)
%%?求解01整數(shù)規(guī)劃的遺傳算法
%%?輸入?yún)?shù)列表
%?M?遺傳進(jìn)化迭代次數(shù)
%?N?種群規(guī)模
%?Pm?變異概率
%%?輸出參數(shù)列表
%?Xp?最優(yōu)個(gè)體
%?LC1?子目標(biāo)1的收斂曲線
%?LC2?子目標(biāo)2的收斂曲線
%?LC3?平均適應(yīng)度函數(shù)的收斂曲線
%?LC4?最優(yōu)適應(yīng)度函數(shù)的收斂曲線
%%?參考調(diào)用格式[XpLC1LC2LC3LC4]=MYGA(50400.3)
%%?第一步:載入數(shù)據(jù)和變量初始化
load?e;%載入三個(gè)系數(shù)矩陣eqw
load?q;
load?w;
%輸出變量初始化
Xp=zeros(450);
LC1=zeros(1M);
LC2=zeros(1M);
LC3=zeros(1M);
LC4=zeros(1M);
Best=inf;
%%?第二步:隨機(jī)產(chǎn)生初始種群
farm=cell(1N);%用于存儲(chǔ)種群的細(xì)胞結(jié)構(gòu)
k=0;
while?k?%以下是一個(gè)合法個(gè)體的產(chǎn)生過程
x=zeros(450);%x每一列的1的個(gè)數(shù)隨機(jī)決定
for?i=1:50
R=rand;
Col=zeros(41);
if?R<0.7
RP=randperm(4);%1的位置也是隨機(jī)的
Col(RP(1))=1;
elseif?R>0.9
RP=randperm(4);
Col(RP(1:2))=1;
else
RP=randperm(4);
Col(RP(1:3))=1;
end
x(:i)=Col;
end
%下面是檢查行和是否滿足約束的過程,對(duì)于不滿足約束的予以拋棄
Temp1=sum(x2);
Temp2=find(Temp1>20);
if?length(Temp2)==0
k=k+1;
farm{k}=x;
end
end
%%?以下是進(jìn)化迭代過程
counter=0;%設(shè)置迭代計(jì)數(shù)器
while?counter
%?第三步:交叉
%交叉采用雙親雙子單點(diǎn)交叉
newfarm=cell(12*N);%用于存儲(chǔ)子代的細(xì)胞結(jié)構(gòu)
Ser=randperm(N);%兩兩隨機(jī)配對(duì)的配對(duì)表
A=farm{Ser(1)};%取出父代A
B=farm{Ser(2)};%取出父代B
P0=unidrnd(49);%隨機(jī)選擇交叉點(diǎn)
a=[A(:1:P0)B(:(P0+1):end)];%產(chǎn)生子代a
b=[B(:1:P0)A(:(P0+1):end)];%產(chǎn)生子代b
newfarm{2*N-1}=a;%加入子代種群
newfarm{2*N}=b;
%以下循環(huán)是重復(fù)上述過程
for?i=1:(N-1)
A=farm{Ser(i)};
B=farm{Ser(i+1)};
P0=unidrnd(49);
a=[A(:1:P0)B(:(P0+1):end)];
b=[B(:1:P0)A(:(P0+1):end)];
newfarm{2*i-1}=a;
newfarm{2*i}=b;
end
FARM=[farmnewfarm];%新舊種群合并
%%?第四步:選擇復(fù)制
FLAG=ones(13*N);%標(biāo)志向量,對(duì)是否滿足約束進(jìn)行標(biāo)記
%以下過程是檢測(cè)新個(gè)體是否滿足約束
for?i=1:(3*N)
x=FARM{i};
sum1=sum(x1);
sum2=sum(x2);
flag1=find(sum1==0);
flag2=find(sum1==4);
flag3=find(sum2>20);
if?le
評(píng)論
共有 條評(píng)論