1、% Y1p 最优方案中,各工件各工序的开始时刻,可根据它绘出甘特图% Y2p 最优方案中,各工件各工序的结束时刻,可根据它绘出甘特图% Y3p 最优方案中,各工件各工序使用的机器编号% Xp 最优决策变量的值,决策变量是一个实数编码的mn矩阵% LC1 收敛曲线1,各代最优个体适应值的记录% LC2 收敛曲线2,各代群体平均适应值的记录% 最后,程序还将绘出三副图片:两条收敛曲线图和甘特图(各工件的调度时序图)%第一步:变量初始化m,n=size(T);%m是总工件数,n是总工序数Xp=zeros(m,n);%最优决策变量LC1=zeros(1,M);%收敛曲线1LC2=zeros(1,N);
2、%收敛曲线2%第二步:随机产生初始种群farm=cell(1,N);%采用细胞结构存储种群for k=1:N X=zeros(m,n); for j=1:n for i=1:m X(i,j)=1+(P(j)-eps)*rand; end end farmk=X;endcounter=0;%设置迭代计数器while counterM%停止条件为达到最大迭代次数 %第三步:交叉 newfarm=cell(1,N);%交叉产生的新种群存在其中 Ser=randperm(N); for i=1:2:(N-1) A=farmSer(i);%父代个体 Manner=unidrnd(2);%随机选择交叉方式
3、 if Manner=1 cp=unidrnd(m-1);%随机选择交叉点 %双亲双子单点交叉 a=A(1:cp,:);B(cp+1):m,:);%子代个体 b=B(1:A(cp+1): else cp=unidrnd(n-1); b=B(:,1:cp),A(:,(cp+1):n); newfarmi=a;%交叉后的子代存入newfarm newfarmi+1=b; %新旧种群合并 FARM=farm,newfarm; %第四步:选择复制 FITNESS=zeros(1,2*N); fitness=zeros(1,N); plotif=0;(2*N) X=FARMi; Z=COST(X,T,P
4、,plotif);%调用计算费用的子函数 FITNESS(i)=Z; %选择复制采取两两随机配对竞争的方式,具有保留最优个体的能力 Ser=randperm(2*N); f2=FITNESS(Ser(2*i); if f1rand;%变异概率为Pm X=farmi; I=unidrnd(m); J=unidrnd(n); X(I,J)=1+(P(J)-eps)*rand; farmi=X; farmpos(1)=Xp; counter=counter+1%输出结果并绘图figure(1);plotif=1;X=Xp;Zp,Y1p,Y2p,Y3p=COST(X,T,P,plotif);figur
5、e(2);plot(LC1);figure(3);plot(LC2);function Zp,Y1p,Y2p,Y3p=COST(X,T,P,plotif)% JSPGA的内联子函数,用于求调度方案的Makespan值% X 调度方案的编码矩阵,是一个实数编码的m% plotif 是否绘甘特图的控制参数% Y1p 最优方案中,各工件各工序的开始时刻% Y2p 最优方案中,各工件各工序的结束时刻m,n=size(X);Y1p=zeros(m,n);Y2p=zeros(m,n);Y3p=zeros(m,n);计算第一道工序的安排Q1=zeros(m,1);Q2=zeros(m,1);R=X(:,1)
6、;%取出第一道工序Q3=floor(R);%向下取整即得到各工件在第一道工序使用的机器的编号%下面计算各工件第一道工序的开始时刻和结束时刻for i=1:P(1)%取出机器编号 pos=find(Q3=i);%取出使用编号为i的机器为其加工的工件的编号 lenpos=length(pos); if lenpos=1 Q1(pos(1)=0; 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); endY1p(:,1)=Q1;Y3p(:,1)=Q3;%第三步:计算剩余工序的安排fo
7、r k=2: R=X(:,k);%取出第k道工序 Q3=floor(R);%向下取整即得到各工件在第k道工序使用的机器的编号 %下面计算各工件第k道工序的开始时刻和结束时刻P(k)%取出机器编号 pos=find(Q3=i); lenpos=length(pos); EndTime=Y2p(pos,k-1);%取出这些机器在上一个工序中的结束时刻 POS=zeros(1,lenpos);%上一个工序完成时间由早到晚的排序 for jj=1: POS(jj)=ppp(1); EndTime(ppp(1)=Inf; end %根据上一个工序完成时刻的早晚,计算各工件第k道工序的开始时刻和结束时刻 Q1(pos(POS(1)=Y2p(pos(POS(1),k-1); Q2(pos(POS(1)=Q1(pos(POS(1)+T(pos(POS(1),k);%前一个工件的结束时刻 if lenpos for j=2: Q1(pos(POS(j)=Y2p(pos(POS(j),k-1);%预定的开始时刻为上一个工序的结束时刻 if Q1(pos(POS(j)Q2(pos(POS(j-1)%如果比前面的工件的结束时刻还早 Q1(pos(POS(j)=Q2(pos(POS(j-1); end end Y1p(:,k)=Q1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1