批处理作业调度(排列树回溯法)

该博客讨论了一种用于解决作业调度问题的回溯算法,目标是最小化所有作业在机器2上的完成时间。代码展示了如何通过交换作业顺序并检查是否优于当前最优解来实现这一目标。约束条件确保只有在当前时间和小于当前最优解时才会继续搜索新的解决方案。
摘要由CSDN通过智能技术生成

问题描述:
每一个作业Ji都有两项任务分别在2台机器上完成。每个作业必须先有机器1处理,然后再由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理时间。则所有作业在机器2上完成处理时间和f=F2i,称为该作业调度的完成时间和。对于给定的n个作业,指定最佳作业调度方案,使其完成时间和达到最小。

约束条件: 当前时间和小于当前最优解才有可能产生新的最优解,否则直接剪枝,不用再遍历这棵子树。

作业流程: 画个简图加强一下对作业工作流程的理解
在这里插入图片描述
排列树
在这里插入图片描述
代码

#include <iostream>
#define MAXS 10000;
using namespace std;
int M[100][3];  //各作业所需的处理时间
int x[100];     //当前作业调度
int bestx[100]; //当前最优作业调度
int f2[100];    //机器2完成处理的时间
int f1=0;         //机器1完成处理的时间
int f=0;          //完成时间和
int bestf=MAXS;      //最优值
int n=0;          //作业数

void Backtrack(int t)
{
   if(t>n)
   {
      for (int i = 1; i <= n;i++)
         bestx[i] = x[i];
      bestf = f;
   }
   else
   {
      for (int i = t; i <= n;i++)
      {
         f1 += M[x[i]][1];
         f2[t] = (f2[t - 1] > f1 ? f2[t - 1] : f1) + M[x[i]][2];
         f += f2[t];
         if(f<bestf)   //当当前时间和小于当前最优解才有可能产生新的最优解
         {
            swap(x[t], x[i]);
            Backtrack(t + 1);
            swap(x[t], x[i]);
         }
         f -= f2[t];
         f1 -= M[x[i]][1];
      }
   }
}
int main()
{
   cout << "请输入作业数目:" << endl;
   cin >> n;
   cout << "请输入各个作业的工作时间" << endl;
   for (int i = 1; i <= n;i++)
   {
      f2[i] = 0;
      x[i] = i;
      cin >> M[x[i]][1] >> M[x[i]][2];
   }
   Backtrack(1);
   cout << "最优值为:" << bestf;
   cout << "最优解为:";
   for (int i = 1; i <= n;i++)
      cout << bestx[i]<<" ";
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值