算法 批处理作业调度

来源:互联网 发布:fanuc编程模拟软件 编辑:程序博客网 时间:2024/05/21 13:18

题目

给定n个作业的集合J={J1,J2,…,Jn}。每一个作业有两项任务分别在两台机器上完成。每个作业必须先由机器1处理,再由机器2处理。作业Ji需要机器j的处理时间为tji,i=1,2,…n,j=1,2。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。则所有作业在机器2上完成处理的时间和f=F21+F22+…+F2n称为该作业调度的完成时间和。

批处理作业调度问题要求,对于给定的n个作业,制定最佳的作业调度方案,使其完成时间和最小。


#include <stdio.h>    #include <math.h> #define n 2int a[n+1][2]={0,0,1,2,3,4};int f1=0;//机器1完成的处理时间int *f2;//第i阶段机器2完成的时间int bValue=0;//当前完成用的时间int bestValue=1000;//最优时间  int *bOrder; //作业顺序;int *bestOrder;//最优作业顺序 void backtrack(int t){      int i,j;      int temp;     if(t>n){        for(i=0;i<=n;i++)              bestOrder[i]=bOrder[i];          bestValue=bValue;      }else{          for(j=t; j<=n; j++){//j从i开始,控制分支数            f1+=a[bOrder[j]][0];//在第1台机器上的完成处理时间            f2[t]=(f2[t-1]>f1?f2[t-1]:f1)+a[bOrder[j]][1];//在机器2上的完成处理时间,f2[0]初值为0            bValue+=f2[t];//总的完成时间和            if(bValue<bestValue){                temp=bOrder[t]; bOrder[t]=bOrder[j]; bOrder[j]=temp;                  backtrack(t+1);                  temp=bOrder[t]; bOrder[t]=bOrder[j]; bOrder[j]=temp;              }            f1-=a[bOrder[j]][0];              bValue-=f2[t];          }      }  }  int main(){      int i,j,k;     f2=new int[n+1];      bOrder=new int[n+1];      bestOrder=new int[n+1];      for(i=0;i<=n;i++){          f2[i]=0;          bOrder[i]=i;      }      //    backtrack(1);      //输出    for(i=1;i<=n;i++)          printf("%d\t",bestOrder[i]);      printf("\n%d",bestValue);      return 0;  }  
0 0
原创粉丝点击