流水线调度问题(动态规划)

问题描述

   已知

   作业个数n=10

   各个作业第一道工序所须时间ai(I=1,2……,n)

   各个作业第二道工序所须时间bi(I=1,2……,n)

作业序号:  1   2     3    4    5    6    7     8    9   10

    a;    25   30   35   40   45    50   55   60   65   70

    b;    21   31  41    51   61    39   49  59    69   79

规定:  (1)任一个作业必须先做完第一道工序才能做第二道工序

(2) 任一个作业的任一道工序必须连续做完,才能中断而让别的作业做完.

   求: 一种最优调度方案,即使总的完成时间最短的调度方案,用长度为n的一维数组s表示,使s[i]为按先后次序排在第ii位进行处理的作业的序号.

调度规则

(1)用一个4*20的结构体二维数组M,第1行存放按从小到大排序的20个所给出的ai和bi,第2行存放相应的作业序号,第3行存放1或2(1代表是来自ai,2代表是来自bi), 第4行存放0或1(0代表作业序号未进入最优调度方案;1代表作业序号已进入最优调度方案)

(2)把全部ai和bi分别成非降序列, 排序完后,按课本所述方法求一种最优调度方案,存放在S中。

(3)按照这一分类次序考察此序列;如果序列中下一个数是aj且作业j还没有调度,那末在还没有使用的最左位置调度作业j;如果下个数是bj且作业j还没有调度,那末在还没有使用的最右位置调度作业j;如果已经调度了作业j,则转到该序列的下一个数。

例:设n=4,(a1,a2,a3,a4)=(3,4,8,10)和(b1,b2,b3,b4)=(6,2,9,15),对这些a和b分类后的序列是 (b2,a1,a2,b1,a3,b3,a4,b4)=(2,3,4,6,8,9,10,15),设σ1,σ2,σ3,σ4是最优调度。由于最小数是b2,置σ4=2,下一个数是a1, 置σ1=1,接着的最小数是a2,由于作业2已被调度,转向再下一个数b1,作业1已被调度,再转向下一个数a3,置σ2=3,最后剩σ3是空的,而作业4还没调度,从而σ3=4。

{  1     3    4      2  }        

#include<stdio.h>

#include<stdlib.h>
struct homework {
    int x;
    int p;
    int lei;
    int t;
};
void sort(struct homework c[20]);
void tiaodu(struct homework c[20],int s[10]);
void search(struct homework c[20],int );
int main(){
    struct homework c[20]={{25,1,1,0},{21,1,2,0},{30,2,1,0},{31,2,2,0},{35,3,1,0},{41,3,2,0},{40,4,1,0},{51,4,2,0},{45,5,1,0},
    {61,5,2,0},{50,6,1,0},{39,6,2,0},{55,7,1,0},{49,7,2,0},{60,8,1,0},{59,8,2,0},{65,9,1,0},{69,9,2,0},{70,10,1,0},{79,10,2,0}};
    int s[10];
    sort(c);
    tiaodu(c,s);
    return 0;
}
void sort(struct homework c[20]){
    int i,j;
    struct homework temp;
    for(i=0;i<20-1;i++)
        for(j=0;j<20-i-1;j++){
            if(c[j].x>c[j+1].x){
                temp=c[j];
                c[j]=c[j+1];
                c[j+1]=temp ;
            }
        }
    for(i=0;i<20;i++){
        printf("%d ",c[i].x);
        printf("%d ",c[i].p);
        printf("%d ",c[i].lei);
        printf("%d ",c[i].t);
        printf("\n");
    }
    printf("\n");
}
void tiaodu(struct homework c[20],int s[10]){
    int i,k=0,g=9;
    for(i=0;i<20;i++){
        if(c[i].t==1)  continue;
        if(c[i].lei==1&&c[i].t==0){
            s[k]=c[i].p;
            k++;
            search(c,c[i].p);
        }
        if(c[i].lei==2&&c[i].t==0){
            s[g]=c[i].p;
            g--;
            search(c,c[i].p);
        }
    }
    for(i=0;i<10;i++){
        printf("%d ",s[i]);
    }
    printf("\n");
}
void search(struct homework c[20],int goal){
    int i;
    for(i=0;i<20;i++){
        if(c[i].p==goal) c[i].t=1;
    }

}

本题的结果为    2 3 4 5 9 10 8 7 6 1

猜你喜欢

转载自blog.csdn.net/huang1600301017/article/details/81022658
今日推荐