本人较懒,以下拷贝自老师的课件。。。除了代码。。
问题描述
给定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);
}