时窗及时窗操作的相关概念
![](https://img-blog.csdnimg.cn/20210118131940281.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NyYXp5X2dpcmxfbWU=,size_16,color_FFFFFF,t_70)
代码:
class Machine_Time_window:
def __init__(self,Machine_index):
self.Machine_index=Machine_index
self.assigned_task = []
self.O_start = []
self.O_end = []
#机器的哪些时间窗是空的,此处只考虑内部封闭的时间窗
def Empty_time_window(self):
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]]
else:
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 Earliest_Start_time(self,Job,last_O_end_time,Processing_time):
time_window=self.Empty_time_window()
S_w=time_window[0]
E_w=time_window[1]
L_w=time_window[2]
can_use_window=[]
if len(self.O_end)>=1:
Earliest=self.O_end[-1]
else:
Earliest=0
return Earliest
if L_w is None:
return Earliest
else:
for i in range(len(L_w)): # 是否可插入时间窗
if L_w[i] >= Processing_time:
if S_w[i] >= last_O_end_time:
Earliest = S_w[i]
break
if S_w[i] < last_O_end_time and E_w[i] - last_O_end_time >= Processing_time:
Earliest = last_O_end_time
break
return Earliest
#工序在机器上加工
def Input(self,Job,last_O_end_time,Processing_time):
Earliest=self.Earliest_Start_time(Job,last_O_end_time,Processing_time)
for i in range(len(self.O_start)):
if self.O_start[i]>Earliest:
self.O_start.insert(i,Earliest)
self.O_end.insert(i,Earliest+Processing_time)
self.assigned_task.insert(i,Job)
break