批处理作业调度 回溯

本人较懒,以下拷贝自老师的课件。。。除了代码。。 

问题描述

     给定n个作业的集合{J1,J2,…,Jn}。每个作业必须先由机器1处理,然后由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。所有作业在机器2上完成处理的时间和称为该作业调度的完成时间和。

批处理作业调度问题要求 :

对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。 

实例分析

tji

机器1

机器2

作业1

2

1

作业2

3

1

作业3

2

3

 

3 个作业的 6 种可能的调度方案是 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1
它们所相应的完成时间和分别是 19 18 20 21 19 19

最佳调度方案是1,3,2,其完成时间和为18 

 算法设计实现代码(c语言)

 
     // 批处理作业问题,回溯
    #include<stdio.h>
     int x[ 100]; // 存储具体的作业调度
     int besttime;
     int a[ 100],b[ 100];

     // int k;
     bool ok( int k) // 作业k与其他作业是否发生冲突(重复)
    {
         int i;
         for(i= 1;i<k;i++)
             if(x[i]==x[k])
                 return  false;
             return  true;
    }

     int  max( int a, int b)
    {
       if(a>b)
           return a;
       else  return b;
    }

     void batchjob( int n, int a[], int b[], int &besttime)
    {   
         int k;
         int i;
        
         int sum1[ 100],sum2[ 100]; // sum1存储机器1的作业时间,sum2存储机器2的作业时间
         for(i= 1;i<=n;i++) // 初始化
        {
                x[i]= 0;
                sum1[i]= 0;
                sum2[i]= 0;
        }
        sum1[ 0]= 0;sum2[ 0]= 0;
        k= 1;
        besttime= 1000000; // 表示besttime为无穷大
         while(k>= 1)
        {
            x[k]=x[k]+ 1;
             while(x[k]<=n)
                 if(ok(k))
                {
                    sum1[k]=sum1[k- 1]+a[x[k]];
                    sum2[k]=max(sum1[k],sum2[k- 1])+b[x[k]];
                     if(sum2[k]<besttime)
                         break;
                     else x[k]=x[k]+ 1;
                }
                 else x[k]=x[k]+ 1;
             if(x[k]<=n&&k<n)
                k=k+ 1; // 安排下一个作业
             else
            {      if(x[k]<=n&&k==n) // 得到一个作业安排 
                      if(besttime>sum2[k])
                       besttime=sum2[k];
                     // printf("zuijiashijian %d\n",besttime);
                x[k]= 0; // 重置x[k],回溯
                k=k- 1;
                
            }
        }
    }



     void main()
    {
         int n,i;
        
        printf( " 输入作业个数:\n ");
        scanf( " %d ",&n);
        printf( " 输入每个作业在机器1上的处理时间:\n ");
         for(i= 1;i<=n;i++)
           scanf( " %d ",&a[i]);
        printf( " 输入每个作业在机器2上的处理时间:\n ");
         for(i= 1;i<=n;i++)
           scanf( " %d ",&b[i]);
        batchjob(n,a,b,besttime);
        printf( " 最佳调度时间为:%d\n ",besttime);

    }

  

 

你可能感兴趣的:(批处理)