批处理作业调度

#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;
}

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值