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