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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 给定Ñ个作业的集合{J1,J2,......,JN}。每个作业必须先由机器1处理,然后由机器2处理。作业籍需要机器Ĵ的处理时间为TJI。对于一个确定的作业调度,设FJI是作业我在相关的知识,希望对你有一定的参考价值。

#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 给定Ñ个作业的集合{J1,J2,......,JN}。每个作业必须先由机器1处理,然后由机器2处理。作业籍需要机器Ĵ的处理时间为TJI。对于一个确定的作业调度,设FJI是作业我在的主要内容,如果未能解决你的问题,请参考以下文章

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

c_cpp 给定Ñ个顶点的多边形,每个顶点标有一个整数,每条边上标有+(加)或是×(乘)号,并且Ñ条边按照顺时针依次编号为1〜n的给出。了一个N = 4个顶点的多边形。游

c_cpp Ñ个作业{1,2,...,N}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工.M1和M2加工作业我所需的时间分别为AI和璧

c_cpp 给定Ñ个矩阵:A1,A2,...,AN,其中艾与艾+ 1是可乘的,I = 1,2,...,N-1确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数

c_cpp 设有Ñ个活动的集合E = {1,2,...,N},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源每个。活动i都有一个要求使用该资源的起始时

c_cpp 设R = {R1,R2,...,RN}是要进行排列的Ñ个元素,RI = R- {RI}。集合X中元素的全排列记为彼尔姆(X)。(RI)彼尔姆( X)表示在全排列Perm(X)的每