zoukankan      html  css  js  c++  java
  • 批处理作业调度 回溯

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

    问题描述

         给定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);

        }

      

  • 相关阅读:
    JS中的逻辑或||逻辑与&&
    for 循环里面事件函数的i值
    getByClass--js
    ul 宽度不固定居中
    style.top style.left js
    trigger() 触发事件
    JavaScript中hasOwnProperty函数
    使用windows powershell ISE管理命令窗口,并集成git命令
    nodeJs跨域设置(express,koa2,eggJs)
    node获取本机动态IP,并对应修改相关JavaScript文件的IP地址
  • 原文地址:https://www.cnblogs.com/qinyg/p/2543599.html
Copyright © 2011-2022 走看看