启发式算法
NEH启发式算法简介
首先计算每个工序在每台机器上的总时间,时间越长优先权数越大。
算法分三步,第一步求每个工序在每台机器上的加工时间总长,按递减顺序排列;第二步取出第一步的前两个工序,即优先权数最大的两个工序;第三部将剩余的工序逐次插入第二步的结果中,插入的位置使得makespan最小。
参考
gatt、makespan
NEH启发式算法
# -*- coding:utf-8 -*-
import numpy as np
import time
from .tool import makespan_value
class NEH:
def sort(self, data):
total_time = np.zeros([2, data.shape[1]])
total_time[0] = data[0]
for i in range(data.shape[1]):
total_time[1, i] = np.sum(data[:, i])
total_time = total_time[:, np.argsort(-total_time[1])]
return total_time
def insert(self, data, total_time):
neh_data = np.zeros([data.shape[0], 2], dtype=data.dtype)
neh_data[:, :2] = data[:, np.array(total_time[0, :2], dtype=int) - 1]
for k in range(2, data.shape[1]):
temp = data[:, int(total_time[0, k] - 1)]
neh_data = np.insert(neh_data, k, temp, axis=1)
for i in range(k):
if makespan_value(neh_data) > makespan_value(np.insert(neh_data, i, temp, axis=1)):
neh_data = np.delete(neh_data, k, axis=1)
neh_data = np.insert(neh_data, i, temp, axis=1)
data_neh = neh_data[0]
return data_neh
def neh(data, draw=0):
"""
:param data: n行m列,第一行工序编号,其他是加工时间
:return:
"""
data = data[:, np.argsort(data[0])]
new = NEH()
start_time = time.time()
total_time = new.sort(data)
data_neh = new.insert(data, total_time)
end_time = time.time()
print("Time used: %s" % (end_time - start_time))
print("The minimum makespan: %s" % makespan_value(data[:, data_neh - 1]))
if draw:
import matplotlib.pyplot as plt
from .tool import gatt
gatt(data[:, data_neh - 1])
plt.show()
return data_neh