算法设计例题:批处理作业调度(回溯)

给定n个作业的集合 J = { J1J2,…,Jn }。每一个作业Ji都有两项任务分别在两台机器上完成。每个作业必须先由机器1处理,然后由机器2处理。作业Ji需要机器j 的处理时间为tji,其实 i=1, 2, …, nj=1, 2。对于一个确定的作业调度,设Fji是 作业i 在 机器j 上完成处理的时间。所有作业在机器2上完成处理的时间之和《算法设计例题:批处理作业调度(回溯)》称为该作业调度的完成时间和。批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。

 

全排列,剪枝

**作业要在b机器完成需先在a机器完成,且b机器无作业
**作业完成时间为在b机器上完成的时间:即在等待时间+工作时间

 

#include <stdio.h>

int book[8];
int path[8];
int work[2][8];
int time_all;

/**
* n:作业个数
* cnt:当前所完成作业个数
* time:到目前为止所完成作业的总时间
* path:最优次序
* book: 标记作业是否完成  也记录着作业完成次序
* work:作业信息
* time_all:完成所有作业所需时间
* machine_a :机器a完成机器上的作业所需时间
* machine_b:机器b完成机器上的作业所需时间
* work-index:作业下标
**
**作业要在b机器完成需先在a机器完成,且b机器无作业
**作业完成时间为在b机器上完成的时间:即在等待时间+工作时间
*/
void fun(int machine_a, int machine_b, int time, int work_index, int cnt, int n){

   // printf("%d///\n",work_index);
    if(time >= time_all)    ///如果当前所需时间超过历史最优时间,剪掉
        return;
    if(cnt == n){               ///完成所有作业
        if(time < time_all){
           /* for( int i = 1; i <= n; i++)
                printf("%d*%d ",i,book[i]);
            printf("\n");*/
           int k = work_index;
            int i = 0;
            do{
                path[i] = k;
                k = book[k];
                i++;
            }while(k!=-1);
            time_all = time;
        }
        return;
    }
    for( int i = 1; i <= n; i++ ){
        if( book[i] == 0 ){  ///作业i未完成
            book[i] = work_index;   ///记录上一次作业的标号
        //    printf("%d*%d ",i,book[i]);
            int temp_a,temp_b;
            temp_a = machine_a+work[0][i];
            if( temp_a >= machine_b ){           ///如果b机器空闲,a作业未结束
                temp_b = temp_a + work[1][i];
      //  printf("%d %d* %d %d\n", machine_a, machine_b,temp_a,temp_b);
            }
            else{                             ///如果a机器空闲,b作业未结束
                temp_b = machine_b + work[1][i];
       // printf("%d %d* %d %d\n", machine_a, machine_b,temp_a,temp_b);
            }
          //  printf("%d %d*\n", temp_a,temp_b);
            int tttt =  temp_b;  /// tttt为此次作业的完成时间
            fun(temp_a, temp_b, time+tttt, i, cnt+1, n);
            book[i] = 0;   ///深搜完成,标记此次作业为未完成
        }
    }
}

int main(){

    int t;
    scanf("%d", &t);
    for( int i = 1; i <= t; i++ ){
        int n;
        scanf("%d", &n);
        for( int j = 1; j <= n; j++ ){
            scanf("%d%d", &work[0][j], &work[1][j]);
            book[j] = 0;
        }
        time_all = 0x3f3f3f3f;
        fun(0,0,0,-1,0,n);
        printf("Case %d: %d\n", i, time_all);
        for(int k = n-1; k >0; k--){
            printf("%d ", path[k] );
        }
        printf("%d\n", path[0]);
    }

    return 0;
}
/*
1
3
1 1
0 2
3 0
*****
2 1 3
9
*****
1
3
2 1
3 1
2 3
*****
1 3 2
18
*****
*/

 

点赞