clear; clc; dbstop if error; M=7; RouN=[4 3 3 2 5 4]; Jm={[2 4 6],[1 2 4 7],[1 3 5 6],[1 3 5 7],0; [2 4 6],[1 3 5],[1 2 4 5 6 7],0,0; [1 4],[1 3 4 6],[2 3 7],0,0; [5 7],[4 5 6],0,0,0; [1 3 5],[2 3 6],[4 5 7],[1 2 5 7],[1 4 6]; [1 2 3 4 6 7],[3 5],[1 4 6],[2 3 7],0}; T ={[16 16 15],[17 18 14 16],[20 20 18 13],[20 17 13 19],0; [17 18 14],[17 18 22],[19 17 21 19 17 19],0,0; [18 20],[18 17 23 19],[22 20 17],0,0; [16 18],[25 20 21],0,0,0; [19 18 16],[12 9 10],[10 13 8],[13 16 14 12],[20 19 22]; [10 9 11 9 9 10],[17 11],[14 10 9],[13 11 10],0}; function [PVal,Cost]=caltime(P,M1,T,Jm,M,CO,s,l,dj,RouN) PNumber=size(Jm,1); WNumber=size(P,2); MT=cell(M,1); TPE=zeros(1,PNumber); PVal=zeros(2,WNumber); Cost=0; for i=1:M MT{i,1}=[0;1000000000]; end for i=1:WNumber val=P(1,i); a=mod(val,100); b=(val-a)/100; c=sum(RouN(1:b-1))+a; m_number=M1(1,c); m=Jm{b,a}(m_number); t=T{b,a}(m_number); co=CO{b,a}(m_number); Cost=co*t*l+t*s;%若是是這樣算根本沒有貪婪解碼的必要,能夠加上待機成本 k=size(MT{m,1},2); for j=1:k t1=MT{m,1}(2,j)-MT{m,1}(1,j);%t1的數值計算表示MT的第m個cell單元中的j列的第二行減去第一行的值 %其含義表示機器的空閒時間。上一行的值表示上一道工序的完成時間,下一行的值表示下一道工序的開始時間 t2=MT{m,1}(2,j)-TPE(1,b); %t2數值計算含義是表示MT的第m個cell單元中的j列的第二行減去某工件上一道工序的完成時間 %其含義表示機器進行下一道工序的開始時間和b工件上一道工序的完成時間的差值用於判斷是否在機器m上加工b工件下一道工序的時間 if t<=min(t1,t2) %二者綜合判斷,取最小值,用於判斷某工序加工時間是否能插入,先加工,若是進入if表示能夠插入 %在能夠插入的狀況下 PVal(1,i)=max(TPE(1,b),MT{m,1}(1,j));%PVal第一行放的是工序的開始加工時間,取的是某工件上一道工序的完成時間 %和機器上一道工序的完成時間中的最大值 PVal(2,i)=PVal(1,i)+t;%PVal第二行放的是工序的加工完成時間,等於上一道從新插入工序的開始加工時間加上機器加工時間 TPE(1,b)=PVal(2,i);%將工序的加工完成時間存放入相對應工件的工序完成時間中 if j<k %能夠插入的話,就將插入的值放在第m個cell單元的第二行中,表示工序開始加工的時間,以前的值就相應變成後面的 MTtemp=MT{m,1}(:,j+1:k); MT{m,1}(2,j+1)=MT{m,1}(2,j); MT{m,1}(2,j)=PVal(1,i); MT{m,1}(1,j+1)=PVal(2,i); MT{m,1}=MT{m,1}(:,1:j+1); MT{m,1}=[MT{m,1} MTtemp]; else MT{m,1}(2,j+1)=MT{m,1}(2,j);%補充MTcell數組中的列數,並賦值。這個表達式含義就是把第j列的第2行賦值給第j+1列的第二行就是1000000 MT{m,1}(2,j)=PVal(1,i);%把剛剛在這個機器上完成的工序開始時間賦給第j列的第2行 MT{m,1}(1,j+1)=PVal(2,i);%把剛剛在這個機器上完成的工序結束時間賦給第j+1列的第1行 MT{m,1}=MT{m,1}(:,1:j+1);%這個就是將拓寬後的MT的第m個單元從新賦給原來的單元 end break; end end end djcost=0; for q_1=1:M mt=MT{q_1,1}; for q_2=1:size(mt,2)-1 djtime=MT{m,1}(2,j)-MT{m,1}(1,j); djcost=djcost+djtime*dj; end end Cost=Cost+djcost; function [MinVal,P,PVal,MVal]=IWOA(M,Jm,T,CO,RouN) WNumber=sum(RouN); NIND=50; b=1; Ps=0.5; Wmax=0.9; Wmin=0.2; gen=1; MAXGEN=50; r1=0.3; r2=0.7; trace=zeros(2,MAXGEN); %混合種羣初始化 %Chrom=zeros(NIND,2*WNumber); MS=initial(NIND,Jm,T,RouN,M); OS=CSH(MS,M,Jm,T,CO,RouN); %Chrom(:,1:WNumber)=MS(:,:); %Chrom(:,WNumber+1,2*WNumber)=OS(:,:); while gen<=MAXGEN [PVal1,ObjVCh,P1,MVal1]=cal(OS,MS,M,Jm,T,CO,RouN); trace(1,gen)=min(ObjVCh); trace(2,gen)=mean(ObjVCh); Position=transback(MS,Jm,M,RouN); PX=ROV(Position,OS,RouN); [~,Best]=min(ObjVCh); Xbest=Position(Best(1),:); for i=1:NIND a=(2-(2*gen/MAXGEN))*(1-(gen^3)/(MAXGEN^3)); A=2*a*r1-a; C=2*r2; L=2*rand-1; X=Position(i,:); W=Wmax-(Wmax-Wmin)*log(1+gen*1.7183/MAXGEN); if rand<Ps if abs(A)<1 D=abs(C*Xbest-X); Xt=Xbest-W*A*D; Position(i,:)=Xt; else q=0.3*(1-gen/MAXGEN); if rand<q [Xmin,~]=min(X); [Xmax,~]=max(X); Xj=Xmin+rand(Xmax-Xmin); Position(i,unidrnd(WNumber))=Xj; end end else DD1=abs(Xbest-X); Xt=DD1*exp(b*L)*cos(2*pi*L)*W+Xbest; Position(i,:)=Xt; end end Position=YH(Position,M); [MS,OS]=trans(Position,PX,RouN,Jm,M); [PVal2,ObjV,P2,MVal2]=cal(OS,MS,M,Jm,T,CO,RouN); if gen==1 if min(ObjVCh)<min(ObjV) Val1=PVal1; Val2=P1; Val3=MVal1; MinVal=min(ObjVCh); else Val1=PVal2; Val2=P2; Val3=MVal2; MinVal=min(ObjV); end end if MinVal>trace(1,gen) Val1=PVal2; Val2=P2; Val3=MVal2; MinVal=trace(1,gen); end gen=gen+1; end PVal=Val1; P=Val2; MVal=Val3; clf; figure(1); for i=1:WNumber val=P(1,i); a=mod(val,100); b=(val-a)/100; c=sum(RouN(1:b-1))+a; m_number=MVal(1,c); m=Jm{b,a}(m_number); MaHao=m; plotRec(PVal(1,i),PVal(2,i),MaHao); mPoint1=PVal(1,i); mPoint2=PVal(2,i); x1=mPoint1; y1=MaHao-0.5; x2=mPoint2; y2=MaHao-0.5; x3=mPoint2; y3=MaHao;
版本:2014a算法