NEH启发式算法

算法思想:

首先计算每个工序在每台机器上的总时间,时间越长优先权数越大。
算法分三步,第一步求每个工序在每台机器上的加工时间总长,按递减顺序排列;
第二步,取出第一步的前两个工序,即优先权数最大的两个工序;
第三步,将剩余的工序逐次插入第二步的结果中,插入的位置使得makespan最小。

//NEH.h

class NEH
{
private:
	int n; //作业数量
	int m; //机器数量
	vector<pair<int, double>> sumPcsTime; //作业根据总加工时间降序排列,int为作业,double为总加工时间
	vector<int> res; //NEH算法求解的调度结果
	double makespan = 0; //NEH算法调度结果对应的最大完工时间
public:
	NEH(const vector<vector<double>>& matrixT);  //输入:加工时间矩阵T (从0开始,T[0][0]即作业1在机器1上加工时间)
	vector<int> getRes(); //输出NEH算法求解结果
	double getMakespan(); //输出NEH算法调度结果对应的最大完工时间
	vector<vector<double>> calculateMakespan(vector<int> res, const vector<vector<double>>& matrixT); //直接计算最大完工时间的函数
	
    //测试用
	void printPcsTime(); //测试用,打印sumPcsTime
};
//NEH.cpp

NEH::NEH(const vector<vector<double>>& matrixT) {
	//初始化 作业数量n,机器数量m
	n = matrixT.size();
	m = matrixT[0].size();
	sumPcsTime.resize(n);
	//测试用,打印作业数n、机器数m、加工时间矩阵matrixT
	cout << "--NEH算法输入--" << endl;
	cout << "作业数:" << n << "  机器数:" << m << endl << "加工时间:" << endl;
	for (size_t i = 0; i < matrixT.size(); i++)
	{
		for (size_t j = 0; j < matrixT[0].size(); j++)
		{
			cout << matrixT[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
 
	//NEH Step1:作业根据总加工时间降序排列
	//1.1 保存作业在各机器上的加工时间之和
	for (int i = 0; i < sumPcsTime.size(); i++) {
		sumPcsTime[i].first = i + 1;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值