您现在的位置:首页 >> 技术文章 >> MATLAB技术 >> 内容

MATLAB代做-python代做-FPGA代做- 找出首先加工的工件在sjb31上的位置

时间:2019-5-16 0:50:15 点击:

  核心提示:MATLAB代做-python代做-FPGA代做- 找出首先加工的工件在sjb31上的位置 ...
function [sjb4,zpb4]=jisuanshijian5(zpb3,sjb3,C)
M=[3 3 3 3 2 3 3 3 3 3];[n,S]=size(C);
sjb31=sjb3;sjb31(:,2:end)=0;
zpb31=zpb3;zpb31(4:12,2:end)=0;zpb31(15:end,2:end)=0;
cs11=zpb31(1,2);cs12=zpb31(2,2);cs13=zpb31(3,2);
cs14=sjb31(:,1)==cs11;cs15=sjb31(:,1)==cs12;cs16=sjb31(:,1)==cs13;%找出首先加工的工件在sjb31上的位置
             
    
sjb31(cs14,2)=0;sjb31(cs15,2)=0;sjb31(cs16,2)=0;%确定首先开工的三个工件的开工和完工时间
sjb31(cs14,3)=C(cs11,1); sjb31(cs15,3)=C(cs12,1); sjb31(cs16,3)=C(cs13,1);
for i=1:M(1)
    cs9=sum((zpb31(i,:)~=0)==1);
    for k=3:cs9
            cs10=zpb31(i,k);%待定时间的工件  
            cs11=zpb31(i,k-1);%前一个工件 
            cs12=find(sjb31(:,1)==cs10);%找到待定时间的工件在sjb3的行号
            cs121=sjb31(cs12,1);
            cs13=find(sjb31(:,1)==cs11); %前一个工件在sjb3的行号
            sjb31(cs12,2)=sjb31(cs13,3);%待定时间的工件在sjb3的开工时间
            sjb31(cs12,3)=sjb31(cs12,2)+C(cs121,1);%待定时间的工件在sjb3的完工时间
    end
end%sjb3上第一阶段的数据确定完毕

%以下在第二阶段,采用FCFS FAM指派工件,即再次确定第二阶段工件指派
sjb31(4:6,4:end)=0;zpb31(4:6,2:end)=0;s=2;% 在第二个阶段进行工件指派
cs11=sort(sjb31(:,3));%sort按升序对元素进行排序,即从小到大排列,用来判断工件完工的先后顺序
if cs11(1)~=cs11(2)
   cs121=find(sjb31(:,3)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
   cs12=cs121;
   if cs11(2)~=cs11(3)
          cs13=find(sjb31(:,3)==cs11(2));%第一阶段第二个完工的工件,在sjb上的序号
          cs14=find(sjb31(:,3)==cs11(3));%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
   else 
          cs131=find(sjb31(:,3)==cs11(2));%第一阶段第二个完工的工件,在sjb上的序号
          cs13=cs131(1);cs14=cs131(2);%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
   end
else  
   cs121=find(sjb31(:,3)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
   cs12=cs121(1);cs13=cs121(2);
   cs14=find(sjb31(:,3)==cs11(3));%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
end
                 
zpb31(M(1)+1,2)=sjb31(cs12,1);%把第一阶段第一个完工的工件指派到第二阶段的第一台机器上加工
zpb31(M(1)+2,2)=sjb31(cs13,1);%把第一阶段第二个完工的工件指派到第二阶段的第二台机器上加工
zpb31(M(1)+3,2)=sjb31(cs14(1),1);%把第一阶段第三个完工的工件指派到第二阶段的第三台机器上加工,cs14有可能等于2
                         
sjb31(cs12,4)=cs11(1);%第二阶段第一个机器开始加工时间
sjb31(cs12,5)=sjb31(cs12,4)+C(sjb31(cs12,1),2);%第二阶段第一个机器完工时间
sjb31(cs13,4)=cs11(2);%第二阶段第二个机器开始加工时间
sjb31(cs13,5)=sjb31(cs13,4)+C(sjb31(cs13,1),2);%第二阶段二个机器完工时间
sjb31(cs14(1),4)=cs11(3);%第二阶段第三个机器开始加工时间
sjb31(cs14(1),5)=sjb31(cs14(1),4)+C(sjb31(cs14(1),1),2);%第二阶段三个机器完工时间
        
if length(cs14)==2
   Q2=[sjb31(cs12,5),sjb31(cs13,5),sjb31(cs14(1),5)];
   [value3,where3]=min(Q2);%找到第二阶段最先完工工件的时间及其加工的机器
   if where3==1 
          cs18=M(1)+1;
          zpb31(cs18,length(find (zpb31(cs18,:)~=0))+1)=sjb31(cs14(2),1);%sjb(cs14(2),1)是要被指派的下一个工件
          sjb31(cs14(2),4)=max([sjb31(cs14(2),3),sjb31(cs12,5)]);%sjb(cs14(2),4)是要被指派的下一个工件的开工时间
          sjb31(cs14(2),5)=sjb31(cs14(2),4)+C(sjb31(cs14(2),1),2);%sjb(cs14(2),5)是要被指派的下一个工件的完工时间
   elseif where3==2
          cs18=M(1)+2;
          zpb31(cs18,length(find (zpb31(cs18,:)~=0))+1)=sjb31(cs14(2),1);
          sjb31(cs14(2),4)=max([sjb31(cs14(2),3),sjb31(cs13,5)]);
          sjb31(cs14(2),5)=sjb31(cs14(2),4)+C(sjb31(cs14(2),1),2);
   elseif where3==3
          cs18=M(1)+3;
          zpb31(cs18,length(find (zpb31(cs18,:)~=0))+1)=sjb31(cs14(2),1);
          sjb31(cs14(2),4)=max([sjb31(cs14(2),3),sjb31(cs14(1),5)]);
          sjb31(cs14(2),5)=sjb31(cs14(2),4)+C(sjb31(cs14(2),1),2);
   end
end
                          
for j=M(s)+1:n
   if cs11(j-1)~=cs11(j)                  
       cs19=find(sjb31(:,3)==cs11(j)); %cs11(j)工件释放时间;释放工件在sjb上的索引号cs19,sjb(cs19,1)是要被指派的下一个工件,完工时间等于cs11(j)的不止一个
       cs21=length(sjb31(cs19,1));%同时完工的工件的数目,即cs19可能是多与一个的,如是两个,则有两个工件同时完工
       for i=1:cs21
               cs14=zpb31(M(1)+1,length(find (zpb31(M(1)+1,:)~=0))) ;%第二阶段第一个机器正在加工的工件
               cs15=zpb31(M(1)+2,length(find (zpb31(M(1)+2,:)~=0))) ;%第二阶段第二个机器正在加工的工件
               cs152=zpb31(M(1)+3,length(find (zpb31(M(1)+3,:)~=0)));%第二阶段第三个机器正在加工的工件
                         
               cs16=find(sjb31(:,1)==cs14);%第二阶段第一个机器正在加工的工件在sjb上的序号
               cs17=find(sjb31(:,1)==cs15);  %第二阶段第二个机器正在加工的工件在sjb上的序号     
               cs172=find(sjb31(:,1)==cs152);%第二阶段第三个机器正在加工的工件在sjb上的序号 
                                                  
               Q2=sort([sjb31(cs16,5),sjb31(cs17,5),sjb31(cs172,5)]);
               % 找到第二阶段最先完工工件的加工的机器                                                           
               if Q2(1)==sjb31(cs16,5)
                  cs18=M(1)+1;
                  zpb31(cs18,length(find (zpb31(cs18,:)~=0))+1)=sjb31(cs19(i),1); %指派同时完工工件中的第一个                                          
                  sjb31(cs19(i),4)=max([sjb31(cs19(i),3),sjb31(cs16,5)]); %计算开工时间
                  sjb31(cs19(i),5)=sjb31(cs19(i),4)+C(sjb31(cs19(i),1),2);%计算完工时间
               elseif  Q2(1)==sjb31(cs17,5)
                  cs18=M(1)+2; 
                  zpb31(cs18,length(find (zpb31(cs18,:)~=0))+1)=sjb31(cs19(i),1);  %指派同时完工工件中的第一个   
                  sjb31(cs19(i),4)=max([sjb31(cs19(i),3),sjb31(cs17,5)]); 
                  sjb31(cs19(i),5)=sjb31(cs19(i),4)+C(sjb31(cs19(i),1),2);
               elseif  Q2(1)==sjb31(cs172,5)
                  cs18=M(1)+3; 
                  zpb31(cs18,length(find (zpb31(cs18,:)~=0))+1)=sjb31(cs19(i),1);  %指派同时完工工件中的第一个   
                  sjb31(cs19(i),4)=max([sjb31(cs19(i),3),sjb31(cs172,5)]); 
                  sjb31(cs19(i),5)=sjb31(cs19(i),4)+C(sjb31(cs19(i),1),2);
               end 
       end% 与for i=1:cs21对应
   end
end  %j=M(s)+1:n%以上第二阶段指派完毕  
%在第三个阶段进行工件指派
s=3;cs11=sort(sjb31(:,5));%sort按升序对元素进行排序,即从小到大排列,用来判断工件完工的先后顺序
if cs11(1)~=cs11(2)
   cs12=find(sjb31(:,5)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
   if cs11(2)~=cs11(3)
      cs13=find(sjb31(:,5)==cs11(2));%第一阶段第二个完工的工件,在sjb上的序号
      cs14=find(sjb31(:,5)==cs11(3));
   else
      cs131=find(sjb31(:,5)==cs11(2));%第一阶段第二个完工的工件,在sjb上的序号
      cs13=cs131(1);cs14=cs131(2);
   end
else  
   cs121=find(sjb31(:,5)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
   cs12=cs121(1);cs13=cs121(2);
   if cs11(2)~=cs11(3)
      cs14=find(sjb31(:,5)==cs11(3));
   else
      cs14=cs121(3);
   end
end
zpb31(7,2)=sjb31(cs12,1);%把第一阶段第一个完工的工件指派到第二阶段的第一台机器上加工
zpb31(8,2)=sjb31(cs13,1);%把第一阶段第二个完工的工件指派到第二阶段的第二台机器上加工
              
sjb31(cs12,6)=cs11(1);%第二阶段第一个机器开始加工时间
sjb31(cs12,7)=sjb31(cs12,6)+C(sjb31(cs12,1),3);%第二阶段第一个机器完工时间
sjb31(cs13,6)=cs11(2);%第二阶段第二个机器开始加工时间
sjb31(cs13,7)=sjb31(cs13,6)+C(sjb31(cs13,1),3);%第二阶段二个机器完工时间
              
%cs14=find(sjb31(:,5)==cs11(3));%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
zpb31(9,2)=sjb31(cs14(1),1);%把第一阶段第三个完工的工件指派到第二阶段的第三台机器上加工,cs14有可能等于2
sjb31(cs14(1),6)=cs11(3);%第二阶段第三个机器开始加工时间
sjb31(cs14(1),7)=sjb31(cs14(1),6)+C(sjb31(cs14(1),1),3);%第二阶段三个机器完工时间
if length(cs14)==2
   [value3,where3]=min([sjb31(cs12,7),sjb31(cs13,7),sjb31(cs14(1),7)]);%找到第二阶段最先完工工件的时间及其加工的机器
   if where3==1 
      zpb31(7,length(find(zpb31(7,:)~=0))+1)=sjb31(cs14(2),1);%sjb(cs14(2),1)是要被指派的下一个工件
      sjb31(cs14(2),6)=max([sjb31(cs14(2),5),sjb31(cs12,7)]);%sjb(cs14(2),4)是要被指派的下一个工件的开工时间
      sjb31(cs14(2),7)=sjb31(cs14(2),6)+C(sjb31(cs14(2),1),3);%sjb(cs14(2),5)是要被指派的下一个工件的完工时间
   elseif where3==2
      zpb31(8,length(find(zpb31(8,:)~=0))+1)=sjb31(cs14(2),1);
      sjb31(cs14(2),6)=max([sjb31(cs14(2),5),sjb31(cs13,7)]);
      sjb31(cs14(2),7)=sjb31(cs14(2),6)+C(sjb31(cs14(2),1),3);
   elseif where3==3
      zpb31(9,length(find(zpb31(9,:)~=0))+1)=sjb31(cs14(2),1);
      sjb31(cs14(2),6)=max([sjb31(cs14(2),5),sjb31(cs14(1),7)]);
      sjb31(cs14(2),7)=sjb31(cs14(2),6)+C(sjb31(cs14(2),1),3);
   end
end
for j=M(s)+1:n
    if cs11(j-1)~=cs11(j)                  
       cs19=find(sjb31(:,5)==cs11(j));%cs14(j)工件释放时间;释放工件在sjb上的索引号cs19,sjb(cs19,1)是要被指派的下一个工件,完工时间等于cs11(j)的不止一个
       cs21=length(sjb31(cs19,1));%同时完工的工件的数目,即cs19可能是多与一个的,如是两个,则有两个工件同时完工
       if cs21==1
       elseif cs21==2
          cs201=cs19(1);cs202=cs19(2);
          cs901=C;cs901(:,1:2)=0;cs901(:,5:end)=0;cs903=sum(cs901,2);
          cs211=cs903(cs201);cs212=cs903(cs202);
          if cs211<cs212
          else
             cs19(1)=cs202;cs19(2)=cs201;
          end
       elseif  cs21==3
          cs201=cs19(1);cs202=cs19(2);cs203=cs19(3);
          cs901=C;cs901(:,1:2)=0;cs901(:,5:end)=0;cs903=sum(cs901,2);
          cs211=cs903(cs201);cs212=cs903(cs202);cs213=cs903(cs203);
          [value,where]=min([cs211,cs212,cs213]);
          if where==1
             cs19(1)=cs201;cs19(2)=cs202;cs19(3)=cs203;
          elseif where==2
             cs19(1)=cs202;cs19(2)=cs201;cs19(3)=cs203;
          elseif  where==3
             cs19(1)=cs203;cs19(2)=cs201;cs19(3)=cs202;
          end
       end
       for i=1:cs21
           cs141=zpb31(7,length(find(zpb31(7,:)~=0)));%第二阶段第一个机器正在加工的工件
           cs15=zpb31(8,length(find(zpb31(8,:)~=0)));%第二阶段第二个机器正在加工的工件
           cs152=zpb31(9,length(find(zpb31(9,:)~=0)));%第二阶段第三个机器正在加工的工件
                         
           cs16=find(sjb31(:,1)==cs141);%第二阶段第一个机器正在加工的工件在sjb上的序号
           cs17=find(sjb31(:,1)==cs15);%第二阶段第二个机器正在加工的工件在sjb上的序号     
           cs172=find(sjb31(:,1)==cs152);%第二阶段第三个机器正在加工的工件在sjb上的序号 
                                                   
           [value3,where3]=min([sjb31(cs16,7),sjb31(cs17,7),sjb31(cs172,7)]);%找到第二阶段最先完工工件的时间及其加工的机器
           if where3==1 
              zpb31(7,length(find(zpb31(7,:)~=0))+1)=sjb31(cs19(i),1); %指派同时完工工件中的第一个                                          
              sjb31(cs19(i),6)=max([sjb31(cs19(i),5),sjb31(cs16,7)]); %计算开工时间
              sjb31(cs19(i),7)=sjb31(cs19(i),6)+C(sjb31(cs19(i),1),3);%计算完工时间
           elseif  where3==2
              zpb31(8,length(find(zpb31(8,:)~=0))+1)=sjb31(cs19(i),1);  %指派同时完工工件中的第一个  
              sjb31(cs19(i),6)=max([sjb31(cs19(i),5),sjb31(cs17,7)]); 
              sjb31(cs19(i),7)=sjb31(cs19(i),6)+C(sjb31(cs19(i),1),3);
           else  %where3==3
              zpb31(9,length(find(zpb31(9,:)~=0))+1)=sjb31(cs19(i),1);  %指派同时完工工件中的第一个   
              sjb31(cs19(i),6)=max([sjb31(cs19(i),5),sjb31(cs172,7)]); 
              sjb31(cs19(i),7)=sjb31(cs19(i),6)+C(sjb31(cs19(i),1),3);
           end 
       end% 与for i=1:cs21对应
    end
end  %j=M(s)+1:n%以上第3阶段指派完毕
 
%在第四个阶段进行工件指派
s=4;cs11=sort(sjb31(:,7));%sort按升序对元素进行排序,即从小到大排列,用来判断工件完工的先后顺序
if cs11(1)~=cs11(2)
   cs12=find(sjb31(:,7)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
   if cs11(2)~=cs11(3)
      cs13=find(sjb31(:,7)==cs11(2));%第一阶段第二个完工的工件,在sjb上的序号
      cs14=find(sjb31(:,7)==cs11(3));
   else
      cs131=find(sjb31(:,7)==cs11(2));%第一阶段第二个完工的工件,在sjb上的序号
      cs13=cs131(1);cs14=cs131(2);
   end
else  
   cs121=find(sjb31(:,7)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
   cs12=cs121(1);cs13=cs121(2);
   if cs11(2)~=cs11(3)
      cs14=find(sjb31(:,7)==cs11(3));
   else
      cs14=cs121(3);
   end
end
zpb31(10,2)=sjb31(cs12,1);%把第一阶段第一个完工的工件指派到第二阶段的第一台机器上加工
zpb31(11,2)=sjb31(cs13,1);%把第一阶段第二个完工的工件指派到第二阶段的第二台机器上加工
              
sjb31(cs12,8)=cs11(1);%第二阶段第一个机器开始加工时间
sjb31(cs12,9)=sjb31(cs12,8)+C(sjb31(cs12,1),4);%第二阶段第一个机器完工时间
sjb31(cs13,8)=cs11(2);%第二阶段第二个机器开始加工时间
sjb31(cs13,9)=sjb31(cs13,8)+C(sjb31(cs13,1),4);%第二阶段二个机器完工时间
              
%cs14=find(sjb31(:,7)==cs11(3));%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
zpb31(12,2)=sjb31(cs14(1),1);%把第一阶段第三个完工的工件指派到第二阶段的第三台机器上加工,cs14有可能等于2
sjb31(cs14(1),8)=cs11(3);%第二阶段第三个机器开始加工时间
sjb31(cs14(1),9)=sjb31(cs14(1),8)+C(sjb31(cs14(1),1),4);%第二阶段三个机器完工时间
if length(cs14)==2
   [value3,where3]=min([sjb31(cs12,9),sjb31(cs13,9),sjb31(cs14(1),9)]);%找到第二阶段最先完工工件的时间及其加工的机器
   if where3==1 
      zpb31(10,length(find(zpb31(10,:)~=0))+1)=sjb31(cs14(2),1);%sjb(cs14(2),1)是要被指派的下一个工件
      sjb31(cs14(2),8)=max([sjb31(cs14(2),7),sjb31(cs12,9)]);%sjb(cs14(2),4)是要被指派的下一个工件的开工时间
      sjb31(cs14(2),9)=sjb31(cs14(2),8)+C(sjb31(cs14(2),1),4);%sjb(cs14(2),5)是要被指派的下一个工件的完工时间
   elseif where3==2
      zpb31(11,length(find(zpb31(11,:)~=0))+1)=sjb31(cs14(2),1);
      sjb31(cs14(2),8)=max([sjb31(cs14(2),7),sjb31(cs13,9)]);
      sjb31(cs14(2),9)=sjb31(cs14(2),8)+C(sjb31(cs14(2),1),4);
   elseif where3==3
      zpb31(12,length(find(zpb31(12,:)~=0))+1)=sjb31(cs14(2),1);
      sjb31(cs14(2),8)=max([sjb31(cs14(2),7),sjb31(cs14(1),9)]);
      sjb31(cs14(2),9)=sjb31(cs14(2),8)+C(sjb31(cs14(2),1),4);
   end
end     
for j=M(s)+1:n
    if cs11(j-1)~=cs11(j)                  
       cs19=find(sjb31(:,7)==cs11(j));%cs14(j)工件释放时间;释放工件在sjb上的索引号cs19,sjb(cs19,1)是要被指派的下一个工件,完工时间等于cs11(j)的不止一个
       cs21=length(sjb31(cs19,1));%同时完工的工件的数目,即cs19可能是多与一个的,如是两个,则有两个工件同时完工
       for i=1:cs21
           cs141=zpb31(10,length(find(zpb31(10,:)~=0)));%第二阶段第一个机器正在加工的工件
           cs15=zpb31(11,length(find(zpb31(11,:)~=0)));%第二阶段第二个机器正在加工的工件
           cs152=zpb31(12,length(find(zpb31(12,:)~=0)));%第二阶段第三个机器正在加工的工件
                         
           cs16=find(sjb31(:,1)==cs141);%第二阶段第一个机器正在加工的工件在sjb上的序号
           cs17=find(sjb31(:,1)==cs15);%第二阶段第二个机器正在加工的工件在sjb上的序号     
           cs172=find(sjb31(:,1)==cs152);%第二阶段第三个机器正在加工的工件在sjb上的序号 
                                                   
           [value3,where3]=min([sjb31(cs16,9),sjb31(cs17,9),sjb31(cs172,9)]);%找到第二阶段最先完工工件的时间及其加工的机器
           if where3==1 
              zpb31(10,length(find(zpb31(10,:)~=0))+1)=sjb31(cs19(i),1); %指派同时完工工件中的第一个                                          
              sjb31(cs19(i),8)=max([sjb31(cs19(i),7),sjb31(cs16,9)]); %计算开工时间
              sjb31(cs19(i),9)=sjb31(cs19(i),8)+C(sjb31(cs19(i),1),4);%计算完工时间
           elseif  where3==2
              zpb31(11,length(find(zpb31(11,:)~=0))+1)=sjb31(cs19(i),1);  %指派同时完工工件中的第一个  
              sjb31(cs19(i),8)=max([sjb31(cs19(i),7),sjb31(cs17,9)]); 
              sjb31(cs19(i),9)=sjb31(cs19(i),8)+C(sjb31(cs19(i),1),4);
           elseif  where3==3
              zpb31(12,length(find(zpb31(12,:)~=0))+1)=sjb31(cs19(i),1);  %指派同时完工工件中的第一个   
              sjb31(cs19(i),8)=max([sjb31(cs19(i),7),sjb31(cs172,9)]); 
              sjb31(cs19(i),9)=sjb31(cs19(i),8)+C(sjb31(cs19(i),1),4);
           end 
       end% 与for i=1:cs21对应
    end
end  %j=M(s)+1:n%以上第四阶段指派完毕

%在第5个阶段进行工件指派
s=5;cs11=sort(sjb31(:,9));%sort按升序对元素进行排序,即从小到大排列,用来判断工件完工的先后顺序
if cs11(1)~=cs11(2)
   cs121=find(sjb31(:,9)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
   cs12=cs121;
   if cs11(2)~=cs11(3)
      cs131=find(sjb31(:,9)==cs11(2));cs13(1)=cs131(1);
   else
      cs131=find(sjb31(:,9)==cs11(2));cs13(1)=cs131(1);cs13(2)=cs131(2);
   end
else  
   cs121=find(sjb31(:,9)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
   cs12=cs121(1);cs13(1)=cs121(2);
   if cs11(2)~=cs11(3)
   else
      cs13(2)=cs121(3);
   end
end
zpb31(13,2)=sjb31(cs12,1);%把第一阶段第一个完工的工件指派到第二阶段的第一台机器上加工
zpb31(14,2)=sjb31(cs13(1),1);%把第一阶段第二个完工的工件指派到第二阶段的第二台机器上加工
sjb31(cs12,10)=cs11(1);%第二阶段第一个机器开始加工时间
sjb31(cs12,11)=sjb31(cs12,10)+C(sjb31(cs12,1),5);%第二阶段第一个机器完工时间
sjb31(cs13(1),10)=cs11(2);%第二阶段第二个机器开始加工时间
sjb31(cs13(1),11)=sjb31(cs13(1),10)+C(sjb31(cs13(1),1),5);%第二阶段二个机器完工时间
if length(cs13)==2
   Q2=[sjb31(cs12,11),sjb31(cs13(1),11)];
   [value3,where3]=min(Q2);%找到第二阶段最先完工工件的时间及其加工的机器
   if where3==1 
      cs18=13;
      zpb31(cs18,length(find(zpb31(cs18,:)~=0))+1)=sjb31(cs13(2),1);%sjb(cs14(2),1)是要被指派的下一个工件
      sjb31(cs13(2),10)=max([sjb31(cs13(2),9),sjb31(cs12,11)]);%sjb(cs14(2),4)是要被指派的下一个工件的开工时间
      sjb31(cs13(2),11)=sjb31(cs13(2),10)+C(sjb31(cs13(2),1),5);%sjb(cs14(2),5)是要被指派的下一个工件的完工时间
   else% where3==2
      cs18=14;
      zpb31(cs18,length(find(zpb31(cs18,:)~=0))+1)=sjb31(cs13(2),1);
      sjb31(cs13(2),10)=max([sjb31(cs13(2),9),sjb31(cs13(1),11)]);
      sjb31(cs13(2),11)=sjb31(cs13(2),10)+C(sjb31(cs13(2),1),5);
   end
end

for k=1:2 
   for i=3:sum(zpb31(12+k,:)~=0)
      cs10=zpb31(12+k,i-1);%前一个工件    
      cs11=find(sjb31(:,1)==cs10);%找到工件在sjb31的行号 
      cs12=sjb31(cs11,11);%前一个工件第5阶段完工时间
      cs13=zpb31(12+k,i);%待定时间的工件
      cs14=find(sjb31(:,1)==cs13);%找到待定时间的工件在sjb31的行号
      cs15=sjb31(cs14,9);%待定时间的工件在第4阶段完工时间
        
      sjb31(cs14,10)=max(cs12,cs15);%待定时间的工件在sjb3的开工时间
      sjb31(cs14,11)=sjb31(cs14,10)+C(cs13,5);%待定时间的工件在sjb3的完工时间
   end 
end


%在第6个阶段进行工件指派 
s=6;cs11=sort(sjb31(:,11));%sort按升序对元素进行排序,即从小到大排列,用来判断工件完工的先后顺序
if cs11(1)~=cs11(2)
   cs12=find(sjb31(:,11)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
   if cs11(2)~=cs11(3)
      cs13=find(sjb31(:,11)==cs11(2));%第一阶段第二个完工的工件,在sjb上的序号
      cs14=find(sjb31(:,11)==cs11(3));
   else
      cs131=find(sjb31(:,11)==cs11(2));%第一阶段第二个完工的工件,在sjb上的序号
      cs13=cs131(1);cs14=cs131(2);
   end
else  
   cs121=find(sjb31(:,11)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
   cs12=cs121(1);cs13=cs121(2);
   if cs11(2)~=cs11(3)
      cs14=find(sjb31(:,11)==cs11(3));
   else
      cs14=cs121(3);
   end
end
zpb31(15,2)=sjb31(cs12,1);%把第一阶段第一个完工的工件指派到第二阶段的第一台机器上加工
zpb31(16,2)=sjb31(cs13,1);%把第一阶段第二个完工的工件指派到第二阶段的第二台机器上加工
              
sjb31(cs12,12)=cs11(1);%第二阶段第一个机器开始加工时间
sjb31(cs12,13)=sjb31(cs12,12)+C(sjb31(cs12,1),6);%第二阶段第一个机器完工时间
sjb31(cs13,12)=cs11(2);%第二阶段第二个机器开始加工时间
sjb31(cs13,13)=sjb31(cs13,12)+C(sjb31(cs13,1),6);%第二阶段二个机器完工时间
              
%cs14=find(sjb31(:,11)==cs11(3));%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
zpb31(17,2)=sjb31(cs14(1),1);%把第一阶段第三个完工的工件指派到第二阶段的第三台机器上加工,cs14有可能等于2
sjb31(cs14(1),12)=cs11(3);%第二阶段第三个机器开始加工时间
sjb31(cs14(1),13)=sjb31(cs14(1),12)+C(sjb31(cs14(1),1),6);%第二阶段三个机器完工时间
if length(cs14)==2
   [value3,where3]=min([sjb31(cs12,13),sjb31(cs13,13),sjb31(cs14(1),13)]);%找到第二阶段最先完工工件的时间及其加工的机器
   if where3==1 
      zpb31(15,length(find(zpb31(15,:)~=0))+1)=sjb31(cs14(2),1);%sjb(cs14(2),1)是要被指派的下一个工件
      sjb31(cs14(2),12)=max([sjb31(cs14(2),11),sjb31(cs12,13)]);%sjb(cs14(2),4)是要被指派的下一个工件的开工时间
      sjb31(cs14(2),13)=sjb31(cs14(2),12)+C(sjb31(cs14(2),1),6);%sjb(cs14(2),5)是要被指派的下一个工件的完工时间
   elseif where3==2
      zpb31(16,length(find (zpb31(16,:)~=0))+1)=sjb31(cs14(2),1);
      sjb31(cs14(2),12)=max([sjb31(cs14(2),11),sjb31(cs13,13)]);
      sjb31(cs14(2),13)=sjb31(cs14(2),12)+C(sjb31(cs14(2),1),6);
   elseif where3==3
      zpb31(17,length(find (zpb31(17,:)~=0))+1)=sjb31(cs14(2),1);
      sjb31(cs14(2),12)=max([sjb31(cs14(2),11),sjb31(cs14(1),13)]);
      sjb31(cs14(2),13)=sjb31(cs14(2),12)+C(sjb31(cs14(2),1),6);
   end
end  
for j=M(s)+1:n
    if cs11(j-1)~=cs11(j)                  
       cs19=find(sjb31(:,11)==cs11(j));%cs14(j)工件释放时间;释放工件在sjb上的索引号cs19,sjb(cs19,1)是要被指派的下一个工件,完工时间等于cs11(j)的不止一个
       cs21=length(sjb31(cs19,1));%同时完工的工件的数目,即cs19可能是多与一个的,如是两个,则有两个工件同时完工
       for i=1:cs21
           cs141=zpb31(15,length(find(zpb31(15,:)~=0)));%第二阶段第一个机器正在加工的工件
           cs15=zpb31(16,length(find(zpb31(16,:)~=0)));%第二阶段第二个机器正在加工的工件
           cs152=zpb31(17,length(find(zpb31(17,:)~=0)));%第二阶段第三个机器正在加工的工件
                        
           cs16=find(sjb31(:,1)==cs141);%第二阶段第一个机器正在加工的工件在sjb上的序号
           cs17=find(sjb31(:,1)==cs15);%第二阶段第二个机器正在加工的工件在sjb上的序号     
           cs172=find(sjb31(:,1)==cs152);%第二阶段第三个机器正在加工的工件在sjb上的序号 
                                                   
           [value3,where3]=min([sjb31(cs16,13),sjb31(cs17,13),sjb31(cs172,13)]);%找到第二阶段最先完工工件的时间及其加工的机器
           if where3==1 
              zpb31(15,length(find(zpb31(15,:)~=0))+1)=sjb31(cs19(i),1); %指派同时完工工件中的第一个                                          
              sjb31(cs19(i),12)=max([sjb31(cs19(i),11),sjb31(cs16,13)]); %计算开工时间
              sjb31(cs19(i),13)=sjb31(cs19(i),12)+C(sjb31(cs19(i),1),6);%计算完工时间
           elseif  where3==2
              zpb31(16,length(find(zpb31(16,:)~=0))+1)=sjb31(cs19(i),1);  %指派同时完工工件中的第一个  
              sjb31(cs19(i),12)=max([sjb31(cs19(i),11),sjb31(cs17,13)]); 
              sjb31(cs19(i),13)=sjb31(cs19(i),12)+C(sjb31(cs19(i),1),6);
           elseif  where3==3
              zpb31(17,length(find(zpb31(17,:)~=0))+1)=sjb31(cs19(i),1);  %指派同时完工工件中的第一个   
              sjb31(cs19(i),12)=max([sjb31(cs19(i),11),sjb31(cs172,13)]); 
              sjb31(cs19(i),13)=sjb31(cs19(i),12)+C(sjb31(cs19(i),1),6);
           end 
       end% 与for i=1:cs21对应
    end
end  %j=M(s)+1:n
  
% 在第7个阶段进行工件指派
s=7;cs11=sort(sjb31(:,13));
if cs11(1)~=cs11(2)
   cs12=find(sjb31(:,13)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
   if cs11(2)~=cs11(3)
      cs13=find(sjb31(:,13)==cs11(2));%第一阶段第二个完工的工件,在sjb上的序号
      cs14=find(sjb31(:,13)==cs11(3));%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
   else 
      cs131=find(sjb31(:,13)==cs11(2));%第一阶段第二个完工的工件,在sjb上的序号
      cs13=cs131(1);cs14=cs131(2);%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
   end
else  
   cs121=find(sjb31(:,13)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
   cs12=cs121(1);cs13=cs121(2);
   if cs11(2)~=cs11(3)
      cs14=find(sjb31(:,13)==cs11(3));%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
   else
      cs14=cs121(3);
   end
end
zpb31(18,2)=sjb31(cs12,1);%把第一阶段第一个完工的工件指派到第二阶段的第一台机器上加工
zpb31(19,2)=sjb31(cs13,1);%把第一阶段第二个完工的工件指派到第二阶段的第二台机器上加工
sjb31(cs12,14)=cs11(1);%第二阶段第一个机器开始加工时间
sjb31(cs12,15)=sjb31(cs12,14)+C(sjb31(cs12,1),7);%第二阶段第一个机器完工时间
sjb31(cs13,14)=cs11(2);%第二阶段第二个机器开始加工时间
sjb31(cs13,15)=sjb31(cs13,14)+C(sjb31(cs13,1),7);%第二阶段二个机器完工时间
              
zpb31(20,2)=sjb31(cs14(1),1);%把第一阶段第三个完工的工件指派到第二阶段的第三台机器上加工,cs14有可能等于2
sjb31(cs14(1),14)=cs11(3);
sjb31(cs14(1),15)=sjb31(cs14(1),14)+C(sjb31(cs14(1),1),7);%第二阶段三个机器完工时间
        
if length(cs14)==2
   [value3,where3]=min([sjb31(cs12,15),sjb31(cs13,15),sjb31(cs14(1),15)]);%找到第二阶段最先完工工件的时间及其加工的机器
   if where3==1 
      zpb31(18,length(find(zpb31(18,:)~=0))+1)=sjb31(cs14(2),1);%sjb(cs14(2),1)是要被指派的下一个工件
      sjb31(cs14(2),14)=max([sjb31(cs14(2),13),sjb31(cs12,15)]);%sjb(cs14(2),4)是要被指派的下一个工件的开工时间
      sjb31(cs14(2),15)=sjb31(cs14(2),14)+C(sjb31(cs14(2),1),7);%sjb(cs14(2),5)是要被指派的下一个工件的完工时间
   elseif where3==2
      zpb31(19,length(find(zpb31(19,:)~=0))+1)=sjb31(cs14(2),1);
      sjb31(cs14(2),14)=max([sjb31(cs14(2),13),sjb31(cs13,15)]);
      sjb31(cs14(2),15)=sjb31(cs14(2),14)+C(sjb31(cs14(2),1),7);
   elseif where3==3
      zpb31(20,length(find(zpb31(20,:)~=0))+1)=sjb31(cs14(2),1);
      sjb31(cs14(2),14)=max([sjb31(cs14(2),13),sjb31(cs14(1),15)]);
      sjb31(cs14(2),15)=sjb31(cs14(2),14)+C(sjb31(cs14(2),1),7);
   end
end
for j=M(s)+1:n
    if cs11(j-1)~=cs11(j)                  
       cs19=find(sjb31(:,13)==cs11(j));%cs14(j)工件释放时间;释放工件在sjb上的索引号cs19,sjb(cs19,1)是要被指派的下一个工件,完工时间等于cs11(j)的不止一个
       cs21=length(sjb31(cs19,1));%同时完工的工件的数目,即cs19可能是多与一个的,如是两个,则有两个工件同时完工
       for i=1:cs21
           cs141=zpb31(18,length(find(zpb31(18,:)~=0)));%第二阶段第一个机器正在加工的工件
           cs15=zpb31(19,length(find(zpb31(19,:)~=0)));%第二阶段第二个机器正在加工的工件
           cs152=zpb31(20,length(find(zpb31(20,:)~=0)));%第二阶段第三个机器正在加工的工件
                         
           cs16=find(sjb31(:,1)==cs141);%第二阶段第一个机器正在加工的工件在sjb上的序号
           cs17=find(sjb31(:,1)==cs15);%第二阶段第二个机器正在加工的工件在sjb上的序号     
           cs172=find(sjb31(:,1)==cs152);%第二阶段第三个机器正在加工的工件在sjb上的序号 
                                                   
           [value3,where3]=min([sjb31(cs16,15),sjb31(cs17,15),sjb31(cs172,15)]);%找到第二阶段最先完工工件的时间及其加工的机器
           if where3==1 
              zpb31(18,length(find(zpb31(18,:)~=0))+1)=sjb31(cs19(i),1); %指派同时完工工件中的第一个                                          
              sjb31(cs19(i),14)=max([sjb31(cs19(i),13),sjb31(cs16,15)]); %计算开工时间
              sjb31(cs19(i),15)=sjb31(cs19(i),14)+C(sjb31(cs19(i),1),7);%计算完工时间
           elseif  where3==2
              zpb31(19,length(find(zpb31(19,:)~=0))+1)=sjb31(cs19(i),1);  %指派同时完工工件中的第一个  
              sjb31(cs19(i),14)=max([sjb31(cs19(i),13),sjb31(cs17,15)]); %计算开工时间
              sjb31(cs19(i),15)=sjb31(cs19(i),14)+C(sjb31(cs19(i),1),7);%计算完工时间
           else  %where3==3
              zpb31(20,length(find(zpb31(20,:)~=0))+1)=sjb31(cs19(i),1);  %指派同时完工工件中的第一个   
              sjb31(cs19(i),14)=max([sjb31(cs19(i),13),sjb31(cs172,15)]); %计算开工时间
              sjb31(cs19(i),15)=sjb31(cs19(i),14)+C(sjb31(cs19(i),1),7);%计算完工时间
           end 
       end% 与for i=1:cs21对应
    end
end  %j=M(s)+1:n
      
% 在第8个阶段进行工件指派 
s=8;cs11=sort(sjb31(:,15));
if cs11(1)~=cs11(2)
   cs12=find(sjb31(:,15)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
   if cs11(2)~=cs11(3)
      cs13=find(sjb31(:,15)==cs11(2));%第一阶段第二个完工的工件,在sjb上的序号
      cs14=find(sjb31(:,15)==cs11(3));%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
   else 
      cs131=find(sjb31(:,15)==cs11(2));%第一阶段第二个完工的工件,在sjb上的序号
      cs13=cs131(1);cs14=cs131(2);%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
   end
else  
   cs121=find(sjb31(:,15)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
   cs12=cs121(1);cs13=cs121(2);
   if cs11(2)~=cs11(3)
      cs14=find(sjb31(:,15)==cs11(3));%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
   else 
      cs14=cs121(3);%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
   end   
end
zpb31(21,2)=sjb31(cs12,1);%把第一阶段第一个完工的工件指派到第二阶段的第一台机器上加工
zpb31(22,2)=sjb31(cs13,1);%把第一阶段第二个完工的工件指派到第二阶段的第二台机器上加工
sjb31(cs12,16)=cs11(1);%第二阶段第一个机器开始加工时间
sjb31(cs12,17)=sjb31(cs12,16)+C(sjb31(cs12,1),8);%第二阶段第一个机器完工时间
sjb31(cs13,16)=cs11(2);%第二阶段第二个机器开始加工时间
sjb31(cs13,17)=sjb31(cs13,16)+C(sjb31(cs13,1),8);%第二阶段二个机器完工时间
              
zpb31(23,2)=sjb31(cs14(1),1);%把第一阶段第三个完工的工件指派到第二阶段的第三台机器上加工,cs14有可能等于2
sjb31(cs14(1),16)=cs11(3);
sjb31(cs14(1),17)=sjb31(cs14(1),16)+C(sjb31(cs14(1),1),8);%第二阶段三个机器完工时间
        
if length(cs14)==2
   [value3,where3]=min([sjb31(cs12,17),sjb31(cs13,17),sjb31(cs14(1),17)]);%找到第二阶段最先完工工件的时间及其加工的机器
   if where3==1 
                                             zpb31(21,length(find(zpb31(21,:)~=0))+1)=sjb31(cs14(2),1);%sjb(cs14(2),1)是要被指派的下一个工件
                                             sjb31(cs14(2),16)=max([sjb31(cs14(2),15),sjb31(cs12,17)]);%sjb(cs14(2),4)是要被指派的下一个工件的开工时间
                                             sjb31(cs14(2),17)=sjb31(cs14(2),16)+C(sjb31(cs14(2),1),8);%sjb(cs14(2),5)是要被指派的下一个工件的完工时间
   elseif where3==2
                                             zpb31(22,length(find(zpb31(22,:)~=0))+1)=sjb31(cs14(2),1);
                                             sjb31(cs14(2),16)=max([sjb31(cs14(2),15),sjb31(cs13,17)]);
                                             sjb31(cs14(2),17)=sjb31(cs14(2),16)+C(sjb31(cs14(2),1),8);
   elseif where3==3
                                             zpb31(23,length(find (zpb31(23,:)~=0))+1)=sjb31(cs14(2),1);
                                             sjb31(cs14(2),16)=max([sjb31(cs14(2),15),sjb31(cs14(1),17)]);
                                             sjb31(cs14(2),17)=sjb31(cs14(2),16)+C(sjb31(cs14(2),1),8);
   end
end
for j=M(s)+1:n
    if cs11(j-1)~=cs11(j)                  
       cs19=find(sjb31(:,15)==cs11(j));%cs14(j)工件释放时间;释放工件在sjb上的索引号cs19,sjb(cs19,1)是要被指派的下一个工件,完工时间等于cs11(j)的不止一个
       cs21=length(sjb31(cs19,1));%同时完工的工件的数目,即cs19可能是多与一个的,如是两个,则有两个工件同时完工
       for i=1:cs21
                        cs141=zpb31(21,length(find(zpb31(21,:)~=0)));%第二阶段第一个机器正在加工的工件
                        cs15=zpb31(22,length(find(zpb31(22,:)~=0)));%第二阶段第二个机器正在加工的工件
                        cs152=zpb31(23,length(find(zpb31(23,:)~=0)));%第二阶段第三个机器正在加工的工件
                         
                        cs16=find(sjb31(:,1)==cs141);%第二阶段第一个机器正在加工的工件在sjb上的序号
                        cs17=find(sjb31(:,1)==cs15);%第二阶段第二个机器正在加工的工件在sjb上的序号     
                        cs172=find(sjb31(:,1)==cs152);%第二阶段第三个机器正在加工的工件在sjb上的序号 
                    [value3,where3]=min([sjb31(cs16,17),sjb31(cs17,17),sjb31(cs172,17)]);%找到第二阶段最先完工工件的时间及其加工的机器
                        if where3==1 
                           zpb31(21,length(find(zpb31(21,:)~=0))+1)=sjb31(cs19(i),1); %指派同时完工工件中的第一个                                          
                           sjb31(cs19(i),16)=max([sjb31(cs19(i),15),sjb31(cs16,17)]); %计算开工时间
                           sjb31(cs19(i),17)=sjb31(cs19(i),16)+C(sjb31(cs19(i),1),8);%计算完工时间
                        elseif  where3==2
                           zpb31(22,length(find (zpb31(22,:)~=0))+1)=sjb31(cs19(i),1);  %指派同时完工工件中的第一个  
                           sjb31(cs19(i),16)=max([sjb31(cs19(i),15),sjb31(cs17,17)]); %计算开工时间
                           sjb31(cs19(i),17)=sjb31(cs19(i),16)+C(sjb31(cs19(i),1),8);%计算完工时间
                        elseif  where3==3
                           zpb31(23,length(find(zpb31(23,:)~=0))+1)=sjb31(cs19(i),1);  %指派同时完工工件中的第一个   
                           sjb31(cs19(i),16)=max([sjb31(cs19(i),15),sjb31(cs172,17)]); %计算开工时间
                           sjb31(cs19(i),17)=sjb31(cs19(i),16)+C(sjb31(cs19(i),1),8);%计算完工时间
                        end 
       end% 与for i=1:cs21对应
    end
end  %j=M(s)+1:n
        
% 在第9个阶段进行工件指派    
s=9;cs11=sort(sjb31(:,17));
if cs11(1)~=cs11(2)
                   cs12=find(sjb31(:,17)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
                           if cs11(2)~=cs11(3)
                               cs13=find(sjb31(:,17)==cs11(2));%第一阶段第二个完工的工件,在sjb上的序号
                               cs14=find(sjb31(:,17)==cs11(3));%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2 3
                           else
                               cs131=find(sjb31(:,17)==cs11(2));%第一阶段第二个完工的工件,在sjb上的序号
                               cs13=cs131(1);cs14=cs131(2);
                           end
else  
                     cs121=find(sjb31(:,17)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
                     cs12=cs121(1);cs13=cs121(2);
                     if cs11(2)~=cs11(3)
                        cs14=find(sjb31(:,17)==cs11(3));%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
                     else 
                        cs14=cs121(3);%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
                     end    
end
zpb31(24,2)=sjb31(cs12,1);%把第一阶段第一个完工的工件指派到第二阶段的第一台机器上加工
zpb31(25,2)=sjb31(cs13,1);%把第一阶段第二个完工的工件指派到第二阶段的第二台机器上加工
sjb31(cs12,18)=cs11(1);%第二阶段第一个机器开始加工时间
sjb31(cs12,19)=sjb31(cs12,18)+C(sjb31(cs12,1),9);%第二阶段第一个机器完工时间
sjb31(cs13,18)=cs11(2);%第二阶段第二个机器开始加工时间
sjb31(cs13,19)=sjb31(cs13,18)+C(sjb31(cs13,1),9);%第二阶段二个机器完工时间
              
zpb31(26,2)=sjb31(cs14(1),1);%把第一阶段第三个完工的工件指派到第二阶段的第三台机器上加工,cs14有可能等于2
sjb31(cs14(1),18)=cs11(3);%第二阶段第三个机器开始加工时间
sjb31(cs14(1),19)=sjb31(cs14(1),18)+C(sjb31(cs14(1),1),9);%第二阶段三个机器完工时间
if length(cs14)==2
   [value3,where3]=min([sjb31(cs12,19),sjb31(cs13,19),sjb31(cs14(1),19)]);%找到第二阶段最先完工工件的时间及其加工的机器
   if where3==1 
      zpb31(24,length(find(zpb31(24,:)~=0))+1)=sjb31(cs14(2),1);%sjb(cs14(2),1)是要被指派的下一个工件
      sjb31(cs14(2),18)=max([sjb31(cs14(2),17),sjb31(cs12,19)]);%sjb(cs14(2),4)是要被指派的下一个工件的开工时间
      sjb31(cs14(2),19)=sjb31(cs14(2),18)+C(sjb31(cs14(2),1),9);%sjb(cs14(2),5)是要被指派的下一个工件的完工时间
   elseif where3==2
      zpb31(25,length(find(zpb31(25,:)~=0))+1)=sjb31(cs14(2),1);
      sjb31(cs14(2),18)=max([sjb31(cs14(2),17),sjb31(cs13,19)]);
      sjb31(cs14(2),19)=sjb31(cs14(2),18)+C(sjb31(cs14(2),1),9);
   elseif where3==3
      zpb31(26,length(find (zpb31(26,:)~=0))+1)=sjb31(cs14(2),1);
      sjb31(cs14(2),18)=max([sjb31(cs14(2),17),sjb31(cs14(1),19)]);
      sjb31(cs14(2),19)=sjb31(cs14(2),18)+C(sjb31(cs14(2),1),9);
   end
end
for j=M(s)+1:n
    if cs11(j-1)~=cs11(j)                  
       cs19=find(sjb31(:,17)==cs11(j));%cs14(j)工件释放时间;释放工件在sjb上的索引号cs19,sjb(cs19,1)是要被指派的下一个工件,完工时间等于cs11(j)的不止一个
       cs21=length(sjb31(cs19,1));%同时完工的工件的数目,即cs19可能是多与一个的,如是两个,则有两个工件同时完工
       for i=1:cs21
                        cs141=zpb31(24,length(find(zpb31(24,:)~=0)));%第二阶段第一个机器正在加工的工件
                        cs15=zpb31(25,length(find(zpb31(25,:)~=0)));%第二阶段第二个机器正在加工的工件
                        cs152=zpb31(26,length(find(zpb31(26,:)~=0)));%第二阶段第三个机器正在加工的工件
                         
                        cs16=find(sjb31(:,1)==cs141);%第二阶段第一个机器正在加工的工件在sjb上的序号
                        cs17=find(sjb31(:,1)==cs15);%第二阶段第二个机器正在加工的工件在sjb上的序号     
                        cs172=find(sjb31(:,1)==cs152);%第二阶段第三个机器正在加工的工件在sjb上的序号 
                       [value3,where3]=min([sjb31(cs16,19),sjb31(cs17,19),sjb31(cs172,19)]);%找到第二阶段最先完工工件的时间及其加工的机器
                       if where3==1 
                          zpb31(24,length(find (zpb31(24,:)~=0))+1)=sjb31(cs19(i),1); %指派同时完工工件中的第一个                                          
                          sjb31(cs19(i),18)=max([sjb31(cs19(i),17),sjb31(cs16,19)]); %计算开工时间
                          sjb31(cs19(i),19)=sjb31(cs19(i),18)+C(sjb31(cs19(i),1),9);%计算完工时间
                       elseif  where3==2
                          zpb31(25,length(find (zpb31(25,:)~=0))+1)=sjb31(cs19(i),1);  %指派同时完工工件中的第一个  
                          sjb31(cs19(i),18)=max([sjb31(cs19(i),17),sjb31(cs17,19)]); %计算开工时间
                          sjb31(cs19(i),19)= sjb31(cs19(i),18)+C(sjb31(cs19(i),1),9);%计算完工时间
                       elseif  where3==3
                          zpb31(26,length(find(zpb31(26,:)~=0))+1)=sjb31(cs19(i),1);  %指派同时完工工件中的第一个   
                          sjb31(cs19(i),18)=max([sjb31(cs19(i),17),sjb31(cs172,19)]); %计算开工时间
                          sjb31(cs19(i),19)=sjb31(cs19(i),18)+C(sjb31(cs19(i),1),9);%计算完工时间
                       end 
       end% 与for i=1:cs21对应
    end
end  %j=M(s)+1:n
     
% 在第10个阶段进行工件指派     
s=10;cs11=sort(sjb31(:,19));%sort按升序对元素进行排序,即从小到大排列,用来判断工件完工的先后顺序
if cs11(1)~=cs11(2)
          cs12=find(sjb31(:,19)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
                    if cs11(2)~=cs11(3)
                       cs13=find(sjb31(:,19)==cs11(2));
                       cs14=find(sjb31(:,19)==cs11(3));%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2 3
                    else
                       cs131=find(sjb31(:,19)==cs11(2));%第一阶段第二个完工的工件,在sjb上的序号
                       cs13=cs131(1);cs14=cs131(2);
                    end
else  
            cs121=find(sjb31(:,19)==cs11(1));%第一阶段第一个完工的工件,cs12是在sjb上的序号
            cs12=cs121(1);cs13=cs121(2);
                 if cs11(2)~=cs11(3)
                     cs14=find(sjb31(:,19)==cs11(3));%第一阶段第三个完工的工件,在sjb上的序号,cs14有可能等于2
                 else
                     cs14=cs121(3);
                 end
end
                
zpb31(27,2)=sjb31(cs12,1);%把第一阶段第一个完工的工件指派到第二阶段的第一台机器上加工
zpb31(28,2)=sjb31(cs13,1);%把第一阶段第二个完工的工件指派到第二阶段的第二台机器上加工
sjb31(cs12,20)=cs11(1);%第二阶段第一个机器开始加工时间
sjb31(cs12,21)=sjb31(cs12,20)+C(sjb31(cs12,1),10);%第二阶段第一个机器完工时间
sjb31(cs13,20)=cs11(2);%第二20段第二个机器开始加工时间
sjb31(cs13,21)=sjb31(cs13,20)+C(sjb31(cs13,1),10);%第二阶段二个机器完工时间
              
zpb31(29,2)=sjb31(cs14(1),1);%把第一阶段第三个完工的工件指派到第二阶段的第三台机器上加工,cs14有可能等于2
sjb31(cs14(1),20)=cs11(3);%第二阶段第三个机器开始加工时间
sjb31(cs14(1),21)=sjb31(cs14(1),20)+C(sjb31(cs14(1),1),10);%第二阶段三个机器完工时间
              
if length(cs14)==2
   [value3,where3]=min([sjb31(cs12,21),sjb31(cs13,21),sjb31(cs14(1),21)]);%找到第二阶段最先完工工件的时间及其加工的机器
                                          if where3==1 
                                             zpb31(27,length(find (zpb31(27,:)~=0))+1)=sjb31(cs14(2),1);%sjb(cs14(2),1)是要被指派的下一个工件
                                             sjb31(cs14(2),20)=max([sjb31(cs14(2),19),sjb31(cs12,21)]);%sjb(cs14(2),4)是要被指派的下一个工件的开工时间
                                             sjb31(cs14(2),21)=sjb31(cs14(2),20)+C(sjb31(cs14(2),1),10);%sjb(cs14(2),5)是要被指派的下一个工件的完工时间
                                          elseif where3==2
                                             zpb31(28,length(find (zpb31(28,:)~=0))+1)=sjb31(cs14(2),1);
                                                 sjb31(cs14(2),20)=max([sjb31(cs14(2),19),sjb31(cs13,21)]);
                                                 sjb31(cs14(2),21)=sjb31(cs14(2),20)+C(sjb31(cs14(2),1),10);
                                         elseif where3==3
                                             zpb31(29,length(find (zpb31(29,:)~=0))+1)=sjb31(cs14(2),1);
                                                 sjb31(cs14(2),20)=max([sjb31(cs14(2),15),sjb31(cs14(1),21)]);
                                                 sjb31(cs14(2),21)=sjb31(cs14(2),20)+C(sjb31(cs14(2),1),10);
                                          end
end
for j=M(s)+1:n
    if cs11(j-1)~=cs11(j)                  
       cs19=find(sjb31(:,19)==cs11(j));%cs14(j)工件释放时间;释放工件在sjb上的索引号cs19,sjb(cs19,1)是要被指派的下一个工件,完工时间等于cs11(j)的不止一个
       cs21=length(sjb31(cs19,1));%同时完工的工件的数目,即cs19可能是多与一个的,如是两个,则有两个工件同时完工
       for i=1:cs21
                 cs141=zpb31(27,length(find(zpb31(27,:)~=0)));%第二阶段第一个机器正在加工的工件
                 cs15=zpb31(28,length(find(zpb31(28,:)~=0)));%第二阶段第二个机器正在加工的工件
                 cs152=zpb31(29,length(find(zpb31(29,:)~=0)));%第二阶段第三个机器正在加工的工件
                         
                 cs16=find(sjb31(:,1)==cs141);%第二阶段第一个机器正在加工的工件在sjb上的序号
                 cs17=find(sjb31(:,1)==cs15);%第二阶段第二个机器正在加工的工件在sjb上的序号     
                 cs172=find(sjb31(:,1)==cs152);%第二阶段第三个机器正在加工的工件在sjb上的序号 
                 [value3,where3]=min([sjb31(cs16,21),sjb31(cs17,21),sjb31(cs172,21)]);%找到第二阶段最先完工工件的时间及其加工的机器
                                            if where3==1 
                                                    zpb31(27,length(find (zpb31(27,:)~=0))+1)=sjb31(cs19(i),1); %指派同时完工工件中的第一个                                          
                                                    sjb31(cs19(i),20)=max([sjb31(cs19(i),19),sjb31(cs16,21)]); %计算开工时间
                                                    sjb31(cs19(i),21)=sjb31(cs19(i),20)+C(sjb31(cs19(i),1),10);%计算完工时间
                                             elseif  where3==2
                                                    zpb31(28,length(find(zpb31(28,:)~=0))+1)=sjb31(cs19(i),1);%指派同时完工工件中的第一个  
                                                    sjb31(cs19(i),20)=max([sjb31(cs19(i),19),sjb31(cs17,21)]); %计算开工时间
                                                    sjb31(cs19(i),21)=sjb31(cs19(i),20)+C(sjb31(cs19(i),1),10);%计算完工时间
                                             elseif  where3==3
                                                    zpb31(29,length(find(zpb31(29,:)~=0))+1)=sjb31(cs19(i),1);%指派同时完工工件中的第一个   
                                                    sjb31(cs19(i),20)=max([sjb31(cs19(i),19),sjb31(cs172,21)]);%计算开工时间
                                                    sjb31(cs19(i),21)=sjb31(cs19(i),20)+C(sjb31(cs19(i),1),10);%计算完工时间
                                             end 
       end% 与for i=1:cs21对应
    end
end  %j=M(s)+1
sjb4=sjb31;
zpb4=zpb31;

 

联系:highspeedlogic

QQ :1224848052

微信:HuangL1121

邮箱:1224848052@qq.com

网站:http://www.mat7lab.com/

网站:http://www.hslogic.com/

微信扫一扫:

作者:不详 来源:网络
  • 您是如何找到本站的?
  • 百度搜索
  • Google搜索
  • 查阅资料过程中
  • 论坛发现
  • 百度贴吧发现
  • 朋友介绍
本站最新成功开发工程项目案例
相关评论
发表我的评论
  • 大名:
  • 内容:
  • matlab代做|matlab专业代做|python代做|matlab淘宝代做|matlab代写(www.hslogic.com) © 2019 版权所有 All Rights Reserved.
  • Email:highspeed_logic@163.com 站长QQ: 1224848052

    专业代做/代写/承接、MATLAB、SIMULINK、FPGA项目、博士/硕士/本科毕业设计、课题设计、论文,毕业论文,Coursework、Eassy、Assignment