CDS算法步骤
第一步导入数据
工件数 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
第1道工序在M1上所用的时间 | 31 | 19 | 23 | 13 | 33 |
第2道工序在M2上所用的时间 | 41 | 55 | 42 | 22 | 5 |
第3道工序在M3上所用的时间 | 25 | 3 | 27 | 14 | 57 |
第4道工序在M4上所用的时间 | 30 | 34 | 6 | 13 | 19 |
代码NO.1
导入数据
data = data[:, np.argsort(data[0])]
#将data的第一行进行排列得到是,第一行从小到大的位置索引
#解析np.argsort()函数
import numpy as np
a = np.array([-1, 2, 5, 3, 9, -11, 0])
arg = np.argsort(a)
输出为:
#[5 0 6 1 3 2 4]
#可以知道np.argsort()是对数组的的安从小到大排列的index
所以代码块1表示的含义:
2 | 5 | 4 |
---|---|---|
… | … | … |
变成
2 | 4 | 5 |
---|---|---|
… | … | … |
代码NO.2
按顺序排列的数组
def group(self, data):
data_group = np.zeros([data.shape[0] - 2, 3, data.shape[1]])
#创建一个三维数组,3块,每块是3行5列
for i in range(data_group.shape[0]):
#对每一块进行循环,行进行遍历
data_group[i, 0] = data[0]
#data第一行的数据赋值给data_group第i页,第一行
for j in range(data.shape[1]):
#对data的列进行遍历
data_group[i, 1, j] = np.sum(data[1:i + 2, j])
#将data第1行到底i+2行相加,在第j列求和赋值给pagei的第1行j列
data_group[i, 2, j] = np.sum(data[-i - 1:, j])
#将data倒数第1行到倒数第i-2行相加,在第j列求和赋值给pagei的第2行j列
return data_group
输出的data_group为:
page1:
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
31 | 19 | 23 | 13 | 33 |
30 | 34 | 6 | 13 | 19 |
page2:
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
72 | 74 | 65 | 35 | 38 |
55 | 37 | 33 | 27 | 76 |
page3:
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
97 | 77 | 92 | 49 | 95 |
96 | 92 | 75 | 49 | 81 |
代码NO.3
按johnson算法
def johnson(self, data_group):
data_johnson = np.zeros([data_group.shape[0], data_group.shape[2]])
#创建3行5列的二维数组
for i in range(data_group.shape[0]):
data_johnson[i] = johnson(data_group[i])
#让data_group的每一块数组都进行johnson算法,
return data_johnson
johnson主程序
def johnson(data, draw=0):
"""
:param data:3行,工序编号,机器1加工时间,机器2加工时间
:return:
"""
data = data[:, np.argsort(data[0])]
#输入数据
new = Johnson()
P, Q = new.group(data)#将数据产生P/Q两组
P, Q = new.sort(P, Q)#分类
data_johnson = new.combine(P, Q)
#在组合P、Q数据,形成新的数据
分组:
def group(self, data):
P = data[:, np.where(data[1] < data[2])[0]]
Q = data[:, np.where(data[1] >= data[2])[0]]
return P, Q
分类:
def sort(self, P, Q):
P = P[:, np.argsort(P[1])]
Q = Q[:, np.argsort(-Q[2])]
return P, Q
拼接:
def combine(self, P, Q):
try:
data = np.hstack([P, Q])
except ValueError:
data = P
data_johnson = data[0]#得到零件的加工序列
return data_johnson
代码NO.4
根据johnson算法德到的序,在根据makespan选择一个最好的序
def select(self, data, data_johnson):
data_johnson = np.array(data_johnson, dtype=int) - 1
data_best = data_johnson[0]#先保存第一个序列,作为初始值
for i in range(1, data_johnson.shape[0]):#对每个序进行遍历
if makespan_value(data[:, data_best]) > makespan_value(data[:, data_johnson[i]]):#比较makespan
data_best = data_johnson[i]#保存最小的makespan
data_best += 1
return data_best
总结一下下:
9.27日主要对CDS算法进行了代码解析,CDS算法简言之就是在进行赛选序,筛选的核心就是根据每道工序的完成时间的和进行的,用了多个列表进行保存,最好排序np.argsort这个函数