资源简介

Matlab源码:遗传算法求混合流水车间调度最优问题(JSPGA),附带matlab源码程序,采用双重种群,可以绘制出每次迭代的最优值和平均值的变化,以及最后绘制最优解的车间调度甘特图

资源截图

代码片段和文件信息

function [ZpY1pY2pY3p]=COST(XTPplotif)
%----------------------------------------------------------------
%   JSPGA的内联子函数,用于求解调度方案的Makespan值
%----------------------------------------------------------------
% 输入参数列表
%    X  调度方案的编码矩阵,是一个实数编码的m*n矩阵
%    T  m*n的矩阵,存储m个工件n个工序的加工时间
%    P  1*n的向量,n个工序中,每一个工序所具有的机床数目
%    plotif  是否绘制甘特图的控制参数
%----------------------------------------------------------------
% 输出参数列表
%   Zp   最优的Makespan值
%   Y1p  最优方案中,各工件各工序的开始时刻,可用来绘制甘特图
%   Y2p  最优方案中,各工件各工序的结束时刻
%   Y3p  最优方案中,各工件各工序使用的机器编号
%   Xp   最优决策变量的值,决策变量是一个实数编码的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);    %向下取整即得到各工件在第一道工序使用的机器编号
% 下面计算各工件第一道工序的开始时刻和结束时刻
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道工序的开始时刻和结束时刻
    for i=1:P(k)    %取出机器编号
        pos=find(Q3==i);    %取出使用编号为i的机器为其加工的工件编号
        lenpos=length(pos);
        if lenpos>=1
            EndTime=Y2p(posk-1);   %取出这些机器在上一个工序中的结束时刻
            POS=zeros(1lenpos);    %上一个工序完成时间由早到晚的排序
            for jj=1:lenpos
                MinEndTime=min(EndTime);
                ppp=find(EndTime==MinEndTime);
                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>=2
                for j=2:lenpos
                    Q1(pos(POS(j)))=Y2p(pos(POS(j))k-1);    %预定的开始时刻为上一个工序的结束时刻
                    Q2(pos(POS(j)))=Q1(pos(POS(j)))+T(pos(POS(j))k);%前一个工件的结束时刻
                    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);%前一个工件的结束时刻
                    end
                end
            end
        end
    end
    Y1p(:k)=Q1;
    Y2p(:k)=Q2;
    Y3p(:k)=Q3;
end
    %----------------------------------------------------------------
    % 第四步:计算最优的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

评论

共有 条评论