Планирование операций во времени windows с пересечением - PullRequest
1 голос
/ 16 апреля 2020

У меня есть список интервалов (время windows), в которых работают машины, например, 0-14, 22-38, 46-62 и др. c. в часах.

Различные операции, которые я выполняю, имеют различную продолжительность, например. 1 час, 5 часов, 7 часов, 32 часа и др. c.

То, что я хочу сделать, это для каждого доступного часа, чтобы сказать, какова продолжительность, и вернуть все уникальные значения. Операциям разрешено превышать интервал, но если это так, они должны продолжаться в следующем доступном интервале, и необходимо добавить время простоя:

Пример:

Время 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 означает, что процесс не может начаться в этот период времени ( время простоя машины))

Возврат: [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

1 Ответ

0 голосов
/ 16 апреля 2020

Кажется, что работает следующее:

Сначала определите ваше время windows, а также время начала и окончания для вашего кадра данных:

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

Далее давайте создадим DataFrame, содержащий охват часов ваше время windows и наличие «доступных» или нет:

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)

enter image description here

Далее определите функцию:

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 

enter image description here

Надеюсь, это поможет!

...