用python实现基于时窗的调度策略(车间调度问题)

时窗及时窗操作的相关概念

代码:

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

猜你喜欢

转载自blog.csdn.net/crazy_girl_me/article/details/112775387