資源簡介
Matlab源碼:遺傳算法求混合流水車間調(diào)度最優(yōu)問題(JSPGA),附帶matlab源碼程序,采用雙重種群,可以繪制出每次迭代的最優(yōu)值和平均值的變化,以及最后繪制最優(yōu)解的車間調(diào)度甘特圖

代碼片段和文件信息
function?[ZpY1pY2pY3p]=COST(XTPplotif)
%----------------------------------------------------------------
%???JSPGA的內(nèi)聯(lián)子函數(shù),用于求解調(diào)度方案的Makespan值
%----------------------------------------------------------------
%?輸入?yún)?shù)列表
%????X??調(diào)度方案的編碼矩陣,是一個實數(shù)編碼的m*n矩陣
%????T??m*n的矩陣,存儲m個工件n個工序的加工時間
%????P??1*n的向量,n個工序中,每一個工序所具有的機床數(shù)目
%????plotif??是否繪制甘特圖的控制參數(shù)
%----------------------------------------------------------------
%?輸出參數(shù)列表
%???Zp???最優(yōu)的Makespan值
%???Y1p??最優(yōu)方案中,各工件各工序的開始時刻,可用來繪制甘特圖
%???Y2p??最優(yōu)方案中,各工件各工序的結(jié)束時刻
%???Y3p??最優(yōu)方案中,各工件各工序使用的機器編號
%???Xp???最優(yōu)決策變量的值,決策變量是一個實數(shù)編碼的m*n矩陣
%----------------------------------------------------------------
%?第一步:變量初始化
[mn]=size(X);
Y1p=zeros(mn);
Y2p=zeros(mn);
Y3p=zeros(mn);
%----------------------------------------------------------------
%?第二步:計算第一道工序的安排
Q1=zeros(m1);
Q2=zeros(m1);
R=X(:1);???%取出第一道工序
Q3=floor(R);????%向下取整即得到各工件在第一道工序使用的機器編號
%?下面計算各工件第一道工序的開始時刻和結(jié)束時刻
for?i=1:P(1)????????%取出機器編號
????pos=find(Q3==i);%取出使用編號為i的機器為其加工的工件編號?find返回向量/矩陣中的位置
????lenpos=length(pos);
????if?lenpos>=1
????????Q1(pos(1))=0;
????????Q2(pos(1))=T(pos(1)1);
????????if?lenpos>=2
????????????for?j=2:lenpos
????????????????Q1(pos(j))=Q2(pos(j-1));
????????????????Q2(pos(j))=Q2(pos(j-1))+T(pos(j)1);
????????????end
????????end
????end
end
Y1p(:1)=Q1;
Y2p(:1)=Q2;
Y3p(:1)=Q3;
%----------------------------------------------------------------
%?第三步:計算剩余工序的安排
for?k=2:n
????R=X(:k);???????%取出第k道工序
????Q3=floor(R);????%向下取整即得到各工件在第k道工序使用的機器編號
????%下面計算各工件第k道工序的開始時刻和結(jié)束時刻
????for?i=1:P(k)????%取出機器編號
????????pos=find(Q3==i);????%取出使用編號為i的機器為其加工的工件編號
????????lenpos=length(pos);
????????if?lenpos>=1
????????????EndTime=Y2p(posk-1);???%取出這些機器在上一個工序中的結(jié)束時刻
????????????POS=zeros(1lenpos);????%上一個工序完成時間由早到晚的排序
????????????for?jj=1:lenpos
????????????????MinEndTime=min(EndTime);
????????????????ppp=find(EndTime==MinEndTime);
????????????????POS(jj)=ppp(1);
????????????????EndTime(ppp(1))=Inf;
????????????end
????????????%根據(jù)上一個工序完成時刻的早晚,計算各工件第k道工序的開始時刻和結(jié)束時刻
????????????Q1(pos(POS(1)))=Y2p(pos(POS(1))k-1);
????????????Q2(pos(POS(1)))=Q1(pos(POS(1)))+T(pos(POS(1))k);%前一個工件的結(jié)束時刻
????????????if?lenpos>=2
????????????????for?j=2:lenpos
????????????????????Q1(pos(POS(j)))=Y2p(pos(POS(j))k-1);????%預(yù)定的開始時刻為上一個工序的結(jié)束時刻
????????????????????Q2(pos(POS(j)))=Q1(pos(POS(j)))+T(pos(POS(j))k);%前一個工件的結(jié)束時刻
????????????????????if?Q1(pos(POS(j))) ???????????????????????Q1(pos(POS(j)))=Q2(pos(POS(j-1)));
???????????????????????Q2(pos(POS(j)))=Q1(pos(POS(j)))+T(pos(POS(j))k);%前一個工件的結(jié)束時刻
????????????????????end
????????????????end
????????????end
????????end
????end
????Y1p(:k)=Q1;
????Y2p(:k)=Q2;
????Y3p(:k)=Q3;
end
????%----------------------------------------------------------------
????%?第四步:計算最優(yōu)的Makespan值
????Y2m=Y2p(:n);
????Zp=max(Y2m);
????%----------------------------------------------------------------
????%?第五步:繪制甘特圖
????c
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????4245??2018-11-14?14:12??JPSGA\COST.m
?????文件????????4016??2018-11-29?19:33??JPSGA\JSPGA.m
?????文件?????????563??2018-11-14?14:12??JPSGA\PlotRec.m
?????文件?????????164??2018-11-29?19:33??JPSGA\TimeFun.m
?????文件???????????0??2018-11-29?19:34??JPSGA\運行TimeFun.txt
評論
共有 條評論