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