批处理作业调度

来源:互联网 发布:中国软件培训网 编辑:程序博客网 时间:2024/05/20 20:47
#include "stdio.h"#include "stdlib.h"#define MAX 10#define INF 10000int 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;}

这里写图片描述

0 0
原创粉丝点击