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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp Ñ个作业{1,2,...,N}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工.M1和M2加工作业我所需的时间分别为AI和璧相关的知识,希望对你有一定的参考价值。

//3d9 动态规划 流水作业调度问题
#include "stdafx.h"
#include <iostream> 
using namespace std; 
 
const int N = 5;
 
class Jobtype
{
	public:
		int operator <=(Jobtype a) const
		{
			return(key<=a.key);
		}
		int key,index;
		bool job;
};
 
int FlowShop(int n,int a[],int b[],int c[]);
void BubbleSort(Jobtype *d,int n);//本例采用冒泡排序
 
int main()
{
	int a[] = {2,4,3,6,1};
	int b[] = {5,2,3,1,7};
	int c[N];
 
	int minTime =  FlowShop(N,a,b,c);
 
	cout<<"作业在机器1上的运行时间为:"<<endl;
	for(int i=0; i<N; i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;
	cout<<"作业在机器2上的运行时间为:"<<endl;
	for(int i=0; i<N; i++)
	{
		cout<<b[i]<<" ";
	}
	cout<<endl;
 
	cout<<"完成作业的最短时间为:"<<minTime<<endl;
	cout<<"编号从0开始,作业调度的顺序为:"<<endl;
	for(int i=0; i<N; i++)
	{
		cout<<c[i]<<" ";
	}
	cout<<endl;
	return 0;
}
 
int FlowShop(int n,int a[],int b[],int c[])
{
	Jobtype *d = new Jobtype[n];
	for(int i=0; i<n; i++)
	{
		d[i].key = a[i]>b[i]?b[i]:a[i];//按Johnson法则分别取对应的b[i]或a[i]值作为关键字
		d[i].job = a[i]<=b[i];//给符合条件a[i]<b[i]的放入到N1子集标记为true
		d[i].index = i;
	}
 
	BubbleSort(d,n);//对数组d按关键字升序进行排序
 
	int j = 0,k = n-1;
 
	for(int i=0; i<n; i++)
	{
		if(d[i].job)
		{
			c[j++] = d[i].index;//将排过序的数组d,取其中作业序号属于N1的从前面进入
		}
		else
		{
			c[k--] = d[i].index;//属于N2的从后面进入,从而实现N1的非减序排序,N2的非增序排序
		}
	}
 
	j = a[c[0]];
	k = j+b[c[0]];
	for(int i=1; i<n; i++)
	{
		j += a[c[i]];//M1在执行c[i]作业的同时,M2在执行c[i-1]号作业,最短执行时间取决于M1与M2谁后执行完
		k = j<k?k+b[c[i]]:j+b[c[i]];//计算最优加工时间
	}
 
	delete d;
	return k;
}
 
//冒泡排序
void BubbleSort(Jobtype *d,int n)
{
	int i,j,flag; 
	Jobtype temp;
 
	for(i=0;i<n;i++){  
		flag = 0;  
		for(j=n-1;j>i;j--){  
			//如果前一个数大于后一个数,则交换  
			if(d[j]<=d[j-1]){  
				temp = d[j];  
				d[j] = d[j-1];  
				d[j-1] = temp;  
				flag = 1;  
			}  
		}  
		//如果本次排序没有进行一次交换,则break,减少了执行之间。  
		if(flag == 0){  
			break;  
		}  
	}
}

以上是关于c_cpp Ñ个作业{1,2,...,N}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工.M1和M2加工作业我所需的时间分别为AI和璧的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

c_cpp 一队士兵在操场上排成一列,士兵总数为N,士兵按照队伍从前往后的顺序从1到Ñ依次编号。每个士兵有各自的身高,第I个士兵的身高为AI。士兵列队完毕后,将军走到队列的最前面。因为身高不

c_cpp 用两个数组来表示所给的含有Ñ个元素的有序集S.用值[0:N]存储有序集中的元素,链接[0:N]存储有序集中元素在数组值中位置的指针(实际上使用数组模拟链表)。链路[0]指向有序集