54 lines
2.3 KiB
Python
54 lines
2.3 KiB
Python
class Machine_Time_window:
|
|
def __init__(self, Machine_index):
|
|
"""
|
|
:param Machine_index: 加工机器序号
|
|
"""
|
|
self.Machine_index = Machine_index
|
|
self.assigned_task = [] # 机器分配的任务记录,包括工件序号以及工序序号
|
|
self.O_start = [] # 各任务工序的开始时间记录
|
|
self.O_end = [] # 各任务工序的结束时间记录
|
|
self.End_time = 0
|
|
|
|
# 机器的哪些时间窗是空的,此处只考虑内部封闭的时间窗,类似甘特图每一行往后叠加
|
|
def Empty_time_window(self):
|
|
"""
|
|
:return: 空格时间的开始、结束、时长
|
|
"""
|
|
time_window_start = []
|
|
time_window_end = []
|
|
len_time_window = []
|
|
if self.O_end is None:
|
|
pass
|
|
elif len(self.O_end) == 1:
|
|
if self.O_start[0] != 0:
|
|
time_window_start = [0]
|
|
time_window_end = [self.O_start[0]]
|
|
elif len(self.O_end) > 1:
|
|
if self.O_start[0] != 0:
|
|
time_window_start.append(0)
|
|
time_window_end.append(self.O_start[0])
|
|
time_window_start.extend(self.O_end[:-1]) # 因为使用时间窗的结束点就是空时间窗的开始点
|
|
time_window_end.extend(self.O_start[1:])
|
|
if time_window_end is not None:
|
|
len_time_window = [time_window_end[i] - time_window_start[i] for i in range(len(time_window_end))]
|
|
return time_window_start, time_window_end, len_time_window
|
|
|
|
# 机器投入新一轮加工
|
|
def _Input(self, Job, M_Ealiest, P_t, O_num):
|
|
if self.O_end != []:
|
|
# 如果当前机器加工的最早开始时间比记录的大,则依次往后排任务,否则将任务插入中间的分配任务记录
|
|
if self.O_start[-1] > M_Ealiest:
|
|
for i in range(len(self.O_end)):
|
|
if self.O_start[i] >= M_Ealiest:
|
|
self.assigned_task.insert(i, [Job + 1, O_num + 1])
|
|
break
|
|
else:
|
|
self.assigned_task.append([Job + 1, O_num + 1])
|
|
else:
|
|
self.assigned_task.append([Job + 1, O_num + 1])
|
|
self.O_start.append(M_Ealiest)
|
|
self.O_start.sort()
|
|
self.O_end.append(M_Ealiest + P_t)
|
|
self.O_end.sort()
|
|
self.End_time = self.O_end[-1]
|