c_cpp 【回溯法】批处理作业调度【5.3】

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 【回溯法】批处理作业调度【5.3】相关的知识,希望对你有一定的参考价值。

#include "stdafx.h"
#include <iostream>
using namespace std; 
 
class Flowshop
{
	friend int Flow(int **M,int n,int bestx[]);
	private:
		void Backtrack(int i);
 
		int **M,    // 各作业所需的处理时间
			*x,     // 当前作业调度
			*bestx,    // 当前最优作业调度
 
			*f2,    // 机器2完成处理时间
			f1,    // 机器1完成处理时间
			f,     // 完成时间和
 
			bestf,    // 当前最优值
			n;  // 作业数
 }; 
 
int Flow(int **M,int n,int bestx[]);
 
template <class Type>
inline void Swap(Type &a, Type &b);
 
int main()
{
	int n=3,bf;
	int M1[4][3]={{0,0,0},{0,2,1},{0,3,1},{0,2,3}};
 
	int **M=new int*[n+1];
 
    for(int i=0;i<=n;i++)
	{
        M[i]=new int[3];
	}
	cout<<"M(i,j)值如下:"<<endl;
 
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<3;j++)
		{
			M[i][j]=M1[i][j];
		}
	}
 
	int bestx[4];
    for(int i=1;i<=n;i++)
	{
		cout<<"(";
		for(int j=1;j<3;j++)
		cout<<M[i][j]<<" ";
		cout<<")";
	}
 
	bf=Flow(M,n,bestx);
 
	for(int i=0;i<=n;i++)
	{
		delete []M[i];
	}
    delete []M;
 
    M=0;
 
	cout<<endl<<"最优值是:"<<bf<<endl;
	cout<<"最优调度是:";
 
	for(int i=1;i<=n;i++)
	{
		cout<<bestx[i]<<" ";
	}
	cout<<endl;
	return 0;
}
 
void Flowshop::Backtrack(int i)
{  
	if (i>n)
	{
		for (int j=1; j<=n; j++)
		{
			bestx[j] = x[j];
		}
		bestf = f;
	}
   else
   {
		for (int j = i; j <= n; j++)
		{
			f1+=M[x[j]][1];
			//机器2执行的是机器1已完成的作业,所以是i-1
			f2[i]=((f2[i-1]>f1)?f2[i-1]:f1)+M[x[j]][2];
 
			f+=f2[i];
			if (f < bestf)//剪枝
			{
				Swap(x[i], x[j]);
				Backtrack(i+1);
				Swap(x[i], x[j]);
			}
			f1-=M[x[j]][1];
			f-=f2[i];
		}
	}
}
 
int Flow(int **M,int n,int bestx[])
{
	int ub=30000;
 
	Flowshop X;
	X.n=n;
	X.x=new int[n+1];
	X.f2=new int[n+1];
 
	X.M=M;
	X.bestx=bestx;
	X.bestf=ub;
 
	X.f1=0;
	X.f=0;
 
	for(int i=0;i<=n;i++)
	{
		X.f2[i]=0,X.x[i]=i;
	}
	X.Backtrack(1);
	delete []X.x;
	delete []X.f2;
	return X.bestf;
}
 
template <class Type>
inline void Swap(Type &a, Type &b)
{ 
	Type temp=a; 
	a=b; 
	b=temp;
}

以上是关于c_cpp 【回溯法】批处理作业调度【5.3】的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 【分支限界法】批处理作业调度

c_cpp 【回溯法】连续邮资问题【5.12】

c_cpp 【回溯法】圆排列问题【5.10】

算法与程序设计:回溯法

c_cpp 给定Ñ个作业的集合{J1,J2,......,JN}。每个作业必须先由机器1处理,然后由机器2处理。作业籍需要机器Ĵ的处理时间为TJI。对于一个确定的作业调度,设Fji是作业我在

c_cpp 给定Ñ个作业的集合{J1,J2,......,JN}。每个作业必须先由机器1处理,然后由机器2处理。作业籍需要机器Ĵ的处理时间为TJI。对于一个确定的作业调度,设FJI是作业我在