给定n个作业的集合 J = { J1,J2,…,Jn }。每一个作业Ji都有两项任务分别在两台机器上完成。每个作业必须先由机器1处理,然后由机器2处理。作业Ji需要机器j 的处理时间为tji,其实 i=1, 2, …, n,j=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
*****
*/