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