【車間調度】基於matlab改進的鯨魚算法求解雙目標柔性車間調度問題【含Matlab源碼 026期】

1、簡介

基於matlab改進的鯨魚算法求解雙目標柔性車間調度問題
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

2、源代碼

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;

3、運行結果

在這裏插入圖片描述
在這裏插入圖片描述

4、備註

版本:2014a算法

相關文章
相關標籤/搜索