【回溯法】批处理作业调度问题

本文探讨了批处理作业调度问题,每个作业需在两台机器上完成,机器1处理后由机器2处理。目标是最小化所有作业在机器2上的总完成时间。通过分析解空间为排列树,提出了运用回溯法搜索最优调度方案的算法框架。
摘要由CSDN通过智能技术生成

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

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

分析:批处理作业调度问题要从n个作业的所有排列中找出最小完成时间和的作业调度,所以批处理作业调度的解空间是一颗排列树。按照回溯法搜索排列树的算法框架,设开始时x=[1,2,...,n]是所给的n个作业,则相应的排列树由x[1:n]的所有排列构成。

递归回溯

#include <iostream>
using namespace std;

class Flowshop;
int Flow(int **,int, int []);

void Swap(int &a, int &b)
{
	int temp=a;
	a=b;
	b=temp;
}

class Flowshop
{
	friend int Flow(int **,int, int []);
private:
	void Backtrack(int i);
	int **M,		//各作业所需的处理时间
		*x,			//当前作业调度
		*bestx,		//当前最优作业调度
		*f2,		//机器2完成处理的时间
		f1,			//机器1完成处理的时间
		f,			//完成时间和
		bestf,		//当前最优值
		n;			//作业数
};

void Flowshop::Backtrack(int i)
{
	if(i&g
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值