您的位置:首页 > 其它

批处理作业调度问题

2016-12-25 15:52 134 查看
批处理作业调度

    给定n个作业的集合J={J1,J2,…,Jn}。每一个作业有两项任务分别在两台机器上完成。每个作业必须先由机器1处理,再由机器2处理。作业Ji需要机器j的处理时间为tji,i=1,2,…n,j=1,2。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。则所有作业在机器2上完成处理的时间和f=F21+F22+…+F2n称为该作业调度的完成时间和。

        批处理作业调度问题要求,对于给定的n个作业,制定最佳的作业调度方案,使其完成时间和最小。

样例输入

3

2 1
3 1
2 3

样例输出

18
1 3 2

解:

批处理作业问题:
n个作业需要在两个机器上完成,要求所用时间最小,
则需要根据执行作业的顺序来决定,所以要进行作业的全排列,求出每一种情况的使用时间,求最小
要对n个作业进行全排列所以要使用a数组存放作业的编码,使用bestlist存放最优的作业次序
在进行作业的全排列过程中需要进行当前作业顺序的执行时间的求取。
此时 f2[t]表示第t个作业执行完毕所需要的时间,也就是(上一个作业执行的时间) 与(前t次作业在机器1上所用时间)取大值再加上机器2时间 
所以当前作业顺序的执行时间为:temptime += f2[t] (如下图解释:)
到达解空间进行判断找到最小值并保存当前数列。 



#include <stdio.h>
int n;
int a[100];
int time[100][2];
int temptime,besttime;
int bestlist[100];
int f1,f2[100];

void dfs(int t)
{
if(t==n)
{
if(temptime<besttime)
{
besttime=temptime;
for(int i=0;i<n;i++)
bestlist[i]=a[i];
}
return;
}else{
for(int j=t;j<n;j++)
{
int temp=a[t];
a[t]=a[j];
a[j]=temp;

f1+=time[a[t]][0];
if(t==0)
f2[t]=(f1>0?f1:0)+time[a[t]][1];
else
f2[t]=(f1>f2[t-1]?f1:f2[t-1])+time[a[t]][1];
temptime+=f2[t];
if(temptime<besttime)
dfs(t+1);
temptime-=f2[t];
f1-=time[a[t]][0];

temp=a[t];
a[t]=a[j];
a[j]=temp;
}
}

}

int main()
{
printf("请输入作业数量\n");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
a[i]=i;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<2;j++)
{
scanf("%d",&time[i][j]);
}
}
besttime=99999;
temptime=0;
f1=0;
dfs(0);
printf("最佳时间为:\n");
printf("%d\n",besttime);
printf("顺序为:\n");
for(int i=0;i<n;i++)
printf("%d\t",bestlist[i]+1);
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息