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