动态规划算法解并行任务调度问题

感谢晶星童鞋的讨论

 

啥也不说,上题目:

用两台处理机A和B处理个作业。设第i个作业交给机器A处理时所需要的时间是ai,若由机器B来处理,则所需要的时间是bi。现在要求每个作业只能由一台机器处理,每台机器都不能同时处理两个作业。设计一个动态规划算法,使得这两台机器处理完这个作业的时间最短(从任何一台机器开工到最后一台机器停工的总的时间)。

 

我一开始以为只有第一个作业完成后,才能进行第二个作业呢,后来才意识到是并行。

 

啥也不说,上代码,C++描述。

#include<iostream>
#include<string>
using namespace std;
int findMax(int a, int b)
{
	if(a > b)
	{
		return a;
	}else
	{
		return b;
	}
}
int findMin(int a, int b)
{
	if(a < b)
	{
		return a;
	}else
	{
		return b;
	}
}
int main()
{
	int N = 6;
	int a[] ={ 2, 5, 7, 10, 5, 2 };
	int b[6] = { 3, 8, 4, 11, 3, 4 };
	int least[6] = {0}; 
	string result[6] = {""};  
	for (int i = 0; i < N; i++)
	{
		least[i] = 99;
	}

	int aSum = 0, bSum = 0;
	for (int i = 0; i < N; i++)
	{
		aSum += a[i];
		bSum += b[i];
	}


    int timeA[6][1000];
	int timeB[6][1000];
	int timeMax[6][1000];
	char who[6][100];
	char tempRlt[100];

	for (int i = 0; i <= a[0]; i++)
	{
		timeA[0][i] = i;
		if (i < a[0])
		{
			timeB[0][i] = b[0];
			who[0][i] = 'b';
		}
		else
		{
			timeB[0][i] = 0;
			who[0][i] = 'a';
		}
		timeMax[0][i] = findMax(timeA[0][i], timeB[0][i]);
	}

	if (a[0] <= b[0])
	{
		least[0] = a[0];
		tempRlt[0] = 'a';
	}
	else
	{
		least[0] = b[0];
		tempRlt[0] = 'b';
	}
	result[0] = string(tempRlt);         

	for (int k = 1; k < N; k++)
	{
		int tempSum = 0;
		for (int temp = 0; temp <= k; temp++)
		{
			tempSum += a[temp];
		}
		for (int i = 0; i <= tempSum; i++)
		{
			timeA[k][i] = i;
			if (i < a[k])
			{
				timeB[k][i] = timeB[k - 1][i] + b[k];
				who[k][i] = 'b';
			}
			else
			{
				if ((timeB[k - 1][i] + b[k]) <= timeB[k - 1][i - a[k]])
				{
					timeB[k][i] = timeB[k - 1][i] + b[k];
					who[k][i] = 'b';
				}
				else
				{
					timeB[k][i] = timeB[k - 1][i - a[k]];
					who[k][i] = 'a';
				}
			}
			timeMax[k][i] = findMax(timeA[k][i], timeB[k][i]);
		}

		for (int i = tempSum + 1; i < aSum; i++)
		{
			timeA[k][i] = tempSum;
			timeB[k][i] = 0;
		}
		int flag = 0;
		for (int i = 0; i <= tempSum; i++)
		{
			if (timeMax[k][i] > 0 && timeMax[k][i] < least[k])
			{
				least[k] = timeMax[k][i];
				flag = i;
			}
		}
		tempRlt[k] = who[k][flag];
		for (int i = k; i > 0 && flag > 0; i--)
		{
			if (tempRlt[i] == 'a')
			{
				flag -= a[i];
				tempRlt[i - 1] = who[i - 1][flag];

			}
			if (tempRlt[i] == 'b')
			{
				tempRlt[i - 1] = who[i - 1][flag];
			}
		}

		result[k] = string(tempRlt);
	}  

	cout << "完成" << N <<"任务顺序为:" << result[N-1] << " 时间为" <<least[N-1] << endl;

}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值