流水线调度问题

问题描述

n个作业 N={1,2,…,n}要在2台机器M1和M2组成的流水线上完成加工。每个作业须M1上加工,然M2上加工。M1和M2加工作业 i 所需的时间分别为 ai 和bi,每台机器同一时间最多只能执行一个作业。

 

思路

流水作业调度问题要求确定这n个作业的最优加工顺序,使得所有作业在两台机器上都加工完成所需最少时间。

可以得到最优调度应该是:

  1. M1上的加工是无间断的。即M1上的加工时间是所有ai之和,但M2上不一定是bi之和。

  2. 使作业在两台机器上的加工次序是完全相同的。

                当  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;
}

 

posted @ 2022-11-13 23:14  kuailest  阅读(51)  评论(0编辑  收藏  举报