MATLAB 用约翰逊排序法则对n个工件在两台机器的加工作业进行调度

发布于:2022-10-28 ⋅ 阅读:(272) ⋅ 点赞:(0)

MATLAB 用约翰逊排序法则对n个工件在两台机器的加工作业进行调度

通过建立函数文件,在主窗口中调用函数,实现Johnson排序法的运用。

函数形式:function [solution] = Johnson(n),其中n表示工件个数。

要求:随机生成一个n*2的加工时间矩阵(推荐取值为1到9),n推荐7-10。

Johnson调度规则:

①列出n个作业在两台机床上的作业时间;
②根据作业时间将n个作业分成P和Q两组。
分组原则:P组的作业在第二台机器上的加工时间比在第一台机器上加工时间长;其余作业为Q组;
③将P组作业按他们在第一台机器上加工时间递增顺序排列,将Q组作业按他们在第二台机器上加工时间递减的顺序排列。
④将P组作业顺序和Q组作业顺序连接在一起,构成的就是生产周期最短的最优作业顺序。
图片来源于网络

建立函数文件
function [ solution ] = Johnson( n )
%Jhonson Summary of this function goes here
%   Detailed explanation goes here
A=randi(9,n,2);
b=1:n;%按工件数量生成序号(行向量)
B=b';%将行序号向量转置为列向量
T=[A,B];
fprintf('随机生成%d个工件在2台机器上的加工时间矩阵:\n其中第3列表示工件的序号\n',n);
disp([T]); %输出加工时间矩阵,其中第3列表示工件初始序号 
p=1;
q=1;
for i=1:n
    if T(i,1) < T(i,2)
        for j=1:3
        P(p,j)=T(i,j);%如果第二台加工时间大于第一台,则归为P组
        end
        p=p+1;
    else
        for j=1:3
        Q(q,j)=T(i,j); %其他情况归为Q组
        end
        q=q+1;
    end
end
[Y,I]=sort(P(:,1));%将P组元素按第一台加工时间重新排列,并将元素原序号存到I
for i=1:size(P,1)
    for j=1:3
    C(i,j)=P(I(i,1),j);%将P组元素按第一台加工时间重新升序排列,存到A
    end
end
[X,J]=sort(Q(:,2),'descend');%将Q组元素按第一台加工时间重新降序排列,并将元素原序号存到J
for k=1:size(Q,1)
    for j=1:3
    D(k,j)=Q(J(k,1),j);%将Q组元素按第一台加工时间重新排列,存到B
    end
end
S=[C;D];   %将C D矩阵进行连接  
solution=S;  
E(1,1)=S(1,1); %E为完工时间矩阵,初始赋值为S(1,1)
E(1,2)=E(1,1)+S(1,2); %计算第1个工件在机器2上的加工完工时间
for i=2:n
    E(i,1)=E(i-1,1)+S(i,1);%从第2个起,计算第i个工件在第1台机器加工完工时间
    E(i,2)=max(E(i,1),E(i-1,2))+S(i,2);%当i-1工件在机器2完工,且i工件在机器1完工时,取其中较大者加上加工时间S(i,2)得到该工件完工时间E
end
Cmax=E(n,2);%Cmax为最后总完工时间
S1=S(:,1);
S2=S(:,2);
disp('调整后的加工时间矩阵:');
disp([S1,S2]);
disp('调整后的加工工件顺序:');
disp(S(:,3));
disp('总作业时间为');
disp(Cmax);
end
运行过程

Johnson(7)
随机生成7个工件在2台机器上的加工时间矩阵:
其中第3列表示工件的序号
9 8 1
3 6 2
3 8 3
3 4 4
5 5 5
6 1 6
1 2 7

调整后的加工时间矩阵:
1 2
3 6
3 8
3 4
9 8
5 5
6 1

调整后的加工工件顺序:
7
2
3
4
1
5
6

总作业时间为
36

运行结果

ans =

 1     2     7
 3     6     2
 3     8     3
 3     4     4
 9     8     1
 5     5     5
 6     1     6