及时调度操作 windows 与交叉

Scheduling operations in time windows with crossing

我有一个机器运行的间隔列表(时间 windows),例如0-14、22-38、46-62 等小时数。

我进行的不同操作具有不同的持续时间,例如。 1 小时、5 小时、7 小时、32 小时等

我想做的是,对于每个可用的小时,说出可能的持续时间和 return 所有唯一值。允许操作超过间隔,但如果超过,则必须在下一个可用间隔继续,并且必须添加空闲时间:

示例:

时间windows:[[1-4], [9-13], [15-21], ...]

时长:4 小时

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 4 8 8 8 x x x x 4 4 5 5 5 x 4 4 4 4 x x x

(x表示进程不能在这个时间段内启动(机器空闲时间))

Return: [4, 5, 8]

编辑:我尝试提取符合条件且持续时间为 4 的小时数,并确定了超过间隔的小时数,但我不确定如何添加时间……我可以看到另一个问题如果它不仅通过第一个间隔,而且通过下一个间隔,我会怎么做?例如持续时间 32 小时...

duration = 4

unique_values = [duration]

for i in range(max(interval_list)[1]): #Get max hour
    for j in interval_list:            #For each interval
        if i >= j[0] and i <= j[1]:    #If hour is in interval
            if i + duration <= j[1]:   #If hour + duration <= interval upperbound
                unique_values.append(duration)     #Add duration
            else:                                  #Else if duration exceed interval... :-(
                pass
        else:
            pass

以下似乎有效:

首先定义您的时间窗以及数据帧的开始和结束时间:

timewindows = [[1,4], [9,13], [15,21]]
start, end = timewindows[0][0], timewindows[-1][-1]

接下来让我们构建一个 DataFrame,其中包含跨越您的时间窗口的小时数以及它们是否 "available":

run_df = pd.DataFrame({"hour": range(start, end + 1)})
run_df.loc[:, 'available'] = run_df['hour'].apply(lambda x: any([x in y for y in [list(range(x[0], x[1] + 1)) for x in timewindows]]))
run_df = run_df.set_index("hour")
run_df.head(10)

接下来,定义函数:

def duration_func(df, duration):
    true_df = df[df['available'] == True]
    for i, row in true_df.iterrows():
        try:
            earliest_available = true_df.loc[(i - 1 + duration):].iloc[0].name
            idle_time = (~df.loc[i:earliest_available]['available']).sum()
            finish = duration + idle_time
        except:
            finish = np.nan
        df.loc[i, 'finish'] = finish
    return df

run_df = duration_func(run_df, duration = 4)
run_df 

希望对您有所帮助!