动态规划之johnson流水线调度

来源:互联网 发布:java开发手册下载 编辑:程序博客网 时间:2024/04/30 11:17

双机流水作业调度问题的Johnson算法

n个作业要在由两台机器M1和M2组成的流水线上完成加工. 每个作业i必须先在M1上然后在M2上加工, 时间分别为ai和bi

确定这n个作业的加工顺序, 使得从第一个任务开始在M1上加工到最后一个任务在M2上加工完成的总时间尽量小.流水线作业调度问题要求确定这n个作业的最佳加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在M2加工完成所需的时间最少。

Johnson算法.
设N1为a<b的作业集合, N2为a>=b的作业集合, 将N1的作业按a非减序排序, N2中的作业按照b非增序排序, 则N1作业接N2作业构成最优顺序.

设 n = 4,(a1,a2,a3,a4)=(3,4,8,10),(b1,b2,b3,b4)=(6,2,9,15)

我们先构造一个三元组

struct Job{

int  node;        //加工顺序

int  min; //对于每个作业 ai 与bi中的较小者

int   ab;        //对于是M1还是M2中的设备,设备号

} job[n];           //代表有n个作业


for( int i =1 ;i <=n ;i++)

{

if( a[i]<=b[i] )

{

job[i] .min = a[i];

job[i].ab = 1;

job[i].node =i;

}

else

{

job[i] .min = b[i];

job[i].ab = 2;

job[i].node =i;

}


}

sort(job,n); 我们需要将三元组从小到大排序

int j=0;           //代表开头

int k=n;          //代表结束

for( int i=1; i<=n; i++)                    //c[]代表最佳的输出顺序 ,但我们还需要求出最短的调度时间

{

if( job[i].ab == 1)

c[j++] = i ;                a[] < b[]   从c[]前面插入 

if(job[i].ab == 2)

c[k--] =i ; a[] > b[]  从c[]的后前插入

}


j = a[ c[1] ];

k = j+ b[ c[1] ];

for( int i=2; i<=n; i++)

{

j=+a[ c[i] ];

k = j>k?j+b[ c[i] ]:k+b[ c[i] ]     //两个的大小分别代表,1 .必须等待M1运行完才能到M2,2.M2已经运行玩了,再等待M1。

}

return k;                                 //k就是我们所要求的最短时间,c[]是我们所要得的最佳输出顺序,