#include "stdio.h"
#include "stdlib.h"
#define MAX 10
#define INF 10000
int n; //作业个数
int m[MAX][3]; //第一列表示作业在机器1上运行时间,第二列表示作业在机器2上运行时间
int f1; //机器1完成的时间
int f2[MAX]; //机器2完成的时间
int f; //最终完成时间
int bestf; //最优最终完成时间
int x[MAX]; //作业调度顺序
int bestx[MAX]; //最佳作业调度顺序
void swap(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
//搜索排列树,寻求最优解
void backtrack(int i)
{
if(i>n) //如果搜索到叶结点
{
int j;
for(j=1; j<=n; j++)
bestx[j] = x[j];
bestf = f;
}
else //如果还有其它结点未搜索到
{
int j;
for(j=i; j<=n; j++) //考察当前结点下,第i步选择作业x[j]
{
f1 += m[x[j]][1]; //机器1完成时间 + 作业x[j]在机器1上完成时间
//因为作业先在机器1上运行,再在机器2上运行,所以机器2的完成时间不可能早于机器1
f2[i] = (f2[i-1]>f1?f2[i-1]:f1) + m[x[j]][2]; //机器2完成时间 + 作业x[i]在机器2上完成时间
f += f2[i]; //更新总完成时间
if(f<bestf) //剪枝处理,如果当前的最优解比前面得到的最优解更好
{
swap(x[i], x[j]); //将第i步的作业选为x[j]
backtrack(i+1);
swap(x[i], x[j]); //返回上一个结点
}
f1 -= m[x[j]][1]; //返回上一个结点
f -= f2[i]; //返回上一个结点
}
}
}
//安排作业最优调度,使所有作业完成时间最短
void flow(int m1[][3], int n1)
{
n = n1;
int i, j;
for(i=0; i<=n; i++) //作业运行时间
for(j=0; j<3; j++)
m[i][j] = m1[i][j];
f = f1 = 0; //总完成时间,机器1完成时间
bestf = INF; //最优总完成时间
for(i=0; i<=n; i++)
{
x[i] = i; //作业调度
f2[i] = 0; //机器2完成时间
}
backtrack(1);
}
int main()
{
int n1 = 3;
int m1[][3] = {
{0, 0, 0},
{0, 2, 1},
{0, 3, 1},
{0, 2, 3}
};
int i;
flow(m1, n1); //安排作业最优调度
printf("作业在机器1上完成时间依次为:");
for(i=1; i<=n; i++)
printf("%d ", m[x[i]][1]);
printf("\n");
printf("作业在机器2上完成时间依次为:");
for(i=1; i<=n; i++)
printf("%d ", m[x[i]][2]);
printf("\n");
printf("最优调度为:\n");
for(i=1; i<=n; i++)
printf("%d ", bestx[i]);
printf("\n");
printf("完成时间为:%d\n", bestf);
return 0;
}
批处理作业调度
最新推荐文章于 2020-12-09 09:53:47 发布