多層編碼遺傳算法把個體編碼分成多層,每層編碼均表示不同的含義,多層編碼共同完整表達了問題的解。
多層編碼遺傳算法擴展了遺傳算法的使用領域,使得遺傳算法可以方便用於複雜問題的求解。
我們以車間調度問題爲例,瞭解和使用多層編碼的遺傳算法。
車間調度問題是指 根據產品的製造需求,分配加工車間順序。要考慮的因素有:機器集、零件集、工序序列集、可選機器集、使用機器加工零件的時間矩陣、費用矩陣。
具體問題如下:
共有6個工件、在10臺機器上加工,每個工件都要經過6道加工工序,每個工序可選擇機器序號如表1,每道工序的加工時間如表2。
在本題中,我們將染色體的前半部分表示所有工件在機器上的加工順序,後半部分表示工件每道工序的加工機器序號。如個體[2 4 3 1 1 2 3 4 2 1 3 3 2 2 1 3],該個體表示4個加工工序都是2次的工件在3臺機器上的加工順序,其中前8位表示工件的加工順序爲:2->4->3->1->1->2->3->4,9到16位表示加工機器,依次爲:2->1->3->3->2->2->1->3
在交叉和變異時,需要在傳統的遺傳算法上有所改變,才能適應這種多層編碼。
求解結果如圖:
參考文獻:
[1]金志勇.基於遺傳算法的車間調度系統研究[D].武漢:武漢理工大學,2006.
[2]蔣麗雯.基於遺傳算法的車間作業調度問題研究[D].上海:上海交通大學,2006.
[3]嚴坤.基於遺傳算法的模糊目標柔性車間調度問題[J].機械科學與技術,2006,25(10):318-322.
[4]孫志峻,朱劍英.具有柔性加工路徑的生產車間智能優化調度[J].機械科學與技術,2001,20(6):255-259.
matlab代碼:
%% 清空環境
clc;clear
%% 下載數據
load scheduleData Jm T JmNumber
%工序 時間
%% 基本參數
NIND=40; %個體數目
MAXGEN=100; %最大遺傳代數
GGAP=0.9; %代溝
XOVR=0.8; %交叉率
MUTR=0.6; %變異率
gen=0; %代計數器
%PNumber 工件個數 MNumber 工序個數
[PNumber MNumber]=size(Jm);
trace=zeros(2, MAXGEN); %尋優結果的初始值
WNumber=PNumber*MNumber; %工序總個數
%% 初始化
Number=zeros(1,PNumber); % PNumber 工件個數
for i=1:PNumber
Number(i)=MNumber; %MNumber工序個數
end
% 代碼2層,第一層工序,第二層機器
Chrom=zeros(NIND,2*WNumber);
for j=1:NIND
WPNumberTemp=Number;
for i=1:WNumber
%隨機產成工序
val=unidrnd(PNumber);
while WPNumberTemp(val)==0
val=unidrnd(PNumber);
end
%第一層代碼表示工序
Chrom(j,i)= val;
WPNumberTemp(val)=WPNumberTemp(val)-1;
%第2層代碼表示機器
Temp=Jm{val,MNumber-WPNumberTemp(val)};
SizeTemp=length(Temp);
%隨機產成工序機器
Chrom(j,i+WNumber)= unidrnd(SizeTemp);
end
end
%計算目標函數值
[PVal ObjV P S]=cal(Chrom,JmNumber,T,Jm);
%% 循環尋找
while gen<MAXGEN
%分配適應度值
FitnV=ranking(ObjV);
%選擇操作
SelCh=select('rws', Chrom, FitnV, GGAP);
%交叉操作
SelCh=across(SelCh,XOVR,Jm,T);
%變異操作
SelCh=aberranceJm(SelCh,MUTR,Jm,T);
%計算目標適應度值
[PVal ObjVSel P S]=cal(SelCh,JmNumber,T,Jm);
%重新插入新種羣
[Chrom ObjV] =reins(Chrom, SelCh,1, 1, ObjV, ObjVSel);
%代計數器增加
gen=gen+1;
%保存最優值
trace(1, gen)=min(ObjV);
trace(2, gen)=mean(ObjV);
% 記錄最佳值
if gen==1
Val1=PVal;
Val2=P;
MinVal=min(ObjV);%最小時間
STemp=S;
end
%記錄 最小的工序
if MinVal> trace(1,gen)
Val1=PVal;
Val2=P;
MinVal=trace(1,gen);
STemp=S;
end
end
% 當前最佳值
PVal=Val1; %工序時間
P=Val2; %工序
S=STemp; %調度基因含機器基因
%% 描繪解的變化
figure(1)
plot(trace(1,:));
hold on;
plot(trace(2,:),'-.');grid;
legend('解的變化','種羣均值的變化');
xlabel('迭代次數');
ylabel('適應度值(s)');
title('算法搜索過程');
%% 顯示最優解
figure(2);
MP=S(1,PNumber*MNumber+1:PNumber*MNumber*2);
for i=1:WNumber
val= P(1,i);
a=(mod(val,100)); %工序
b=((val-a)/100); %工件
Temp=Jm{b,a};
mText=Temp(MP(1,i));
x1=PVal(1,i);
x2=PVal(2,i);
y1=mText-1;
y2=mText;
plotRec(x1,x2,mText);
plotRec(PVal(1,i),PVal(2,i),mText);
hold on;
fill([x1,x2,x2,x1],[y1,y1,y2,y2],[1-1/b,1/b,b/PNumber]);
text((x1+x2)/2,mText-0.25,num2str(P(i)));
xlabel('時間(s)');
ylabel('加工機器');
title('甘特圖');
End