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