流水线调度问题
问题描述
n个作业 N={1,2,…,n}要在2台机器M1和M2组成的流水线上完成加工。每个作业须先在M1上加工,然后在M2上加工。M1和M2加工作业 i 所需的时间分别为 ai 和bi,每台机器同一时间最多只能执行一个作业。
思路
流水作业调度问题要求确定这n个作业的最优加工顺序,使得所有作业在两台机器上都加工完成所需最少时间。
可以得到最优调度应该是:
-
M1上的加工是无间断的。即M1上的加工时间是所有ai之和,但M2上不一定是bi之和。
-
使作业在两台机器上的加工次序是完全相同的。
当 M1 a1 a2 的时候
顺序只能是 M2 b1 b2
因为如果b1,b2调换的话,b2需要等a2开始了才能进行加工
会导致a1开始到接受时b2无法进行加工
则得:仅需考虑在两台机上加工次序完全相同的调度
Johnson不等式
之后进行Johnson不等式的分析,这里就不解释了,直接记之后的结论吧
结论
结论:
先把所有作业的ai和bi放在一起,
从这之中选个最小的, 如果是bi的话这个作业i就放最后 ,
如果是ai的话这个作业就放最前, 把这个已经安排好的作业从作业集中删除。
重复上述步骤即可。
代码
#include<stdio.h> struct work{ int key; int num; int judge; }d[100]; int main(){ int a[7]={6,3,8,4,5,6,9}; int b[7]={7,4,9,2,2,3,7}; int c[7]; for(int i=0;i<7;i++){ if(a[i]<b[i]){ d[i].key=a[i]; d[i].judge=0;//s1上时间短,排在前面 } else{ d[i].key=b[i]; d[i].judge=1; } d[i].num=i; } for(int i=0;i<7;i++){ for(int j=i;j<6;j++){ if(d[j].key>d[j+1].judge){ int keyy,numm,judgee; keyy=d[j].key;numm=d[j].num;judgee=d[j].judge; d[j].num=d[j+1].num;d[j].key=d[j+1].key;d[j].judge=d[j+1].judge; d[j+1].key=keyy;d[j+1].judge=judgee;d[j+1].num=numm; } } } int m=0; int n=6; for(int i=0;i<7;i++){ if(d[i].judge==0) c[m++]=d[i].num; else c[n--]=d[i].num; } printf("作业顺序为:"); for(int i=0;i<7;i++) { printf("%d ",c[i]); } int s1=a[c[0]]; int sum=s1+b[c[0]]; for(int i=1;i<7;i++){ s1+=a[c[i]]; if(s1>sum){ sum=s1+b[c[i]]; } else sum+=b[c[i]]; } printf("\n%d",sum); return 0; }