批处理作业调度 回溯

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

问题描述

     给定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,31,3,22,1,32,3,13,1,23,2,1
它们所相应的完成时间和分别是191820211919

最佳调度方案是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);

    }

  

 

posted @ 2012-06-11 22:22  qinyg  阅读(2145)  评论(2编辑  收藏  举报