CDS算法解析

基于Python的CDS算法解析

CDS算法步骤

第一步导入数据

工件数12345
第1道工序在M1上所用的时间3119231333
第2道工序在M2上所用的时间415542225
第3道工序在M3上所用的时间253271457
第4道工序在M4上所用的时间303461319

代码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表示的含义:

254

变成

245

代码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:

12345
3119231333
303461319

page2:

12345
7274653538
5537332776

page3:

12345
9777924995
9692754981

代码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这个函数

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

self.键盘上的钢琴师.LX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值