Я хотел бы реализовать динамическую множественную очередь временной шкалы. Контекст здесь планированиев целом.
Это по-прежнему просто: это временная шкала задач, где каждое событие имеет свое время начала и окончания. Задачи сгруппированы как задания. Эта группа задач должна сохранять свой порядок, но ее можно перемещать во времени как единое целое. Например, это может быть представлено так:
--t1-- ---t2.1-----------t2.2-------
' ' ' ' '
20 30 40 70 120
Я бы реализовал это как очередь кучис некоторыми дополнительными ограничениями. Модуль Pythonsched
имеет несколько основных подходов в этом направлении.
Одна очередь соответствует ресурсу, а ресурс необходим задаче. Графический пример:
R1 --t1.1----- --t2.2----- -----t1.3--
/ \ /
R2 --t2.1-- ------t1.2-----
Становится интересным, когда задача может использовать один из нескольких ресурсов. Дополнительным ограничением является то, что последовательные задачи, которые могут выполняться на одном и том же ресурсе, должны использовать один и тот же ресурс.
Пример: Если (сверху) задача t1.3
может выполняться на R1
или R2
, очередь должна выглядеть так:
R1 --t1.1----- --t2.2-----
/ \
R2 --t2.1-- ------t1.2----------t1.3--
start
, где есть свободное время для duration
(см. подробное объяснение на конец).FirstFreeSlot
.Суть в следующем: как я могу представитьэту информацию, чтобы обеспечить функциональность эффективно? Реализация зависит от меня ;-)
Обновление : Еще один момент для рассмотрения: типичные интервальные структуры сосредоточены на «Что находится в точке X?» Но в этом случае ставится в очередь
и, следовательно, вопрос «Где находится первый пустой слот для длительности D?» гораздо важнее.Таким образом, дерево сегментов/интервалов или что-то еще в этом направлении, вероятно, не является правильным выбором.
Чтобы уточнить вопрос со свободными слотами: из-за того, что у нас есть несколько ресурсов и ограничение сгруппированных задач, на некоторых ресурсах могут быть свободные временные интервалы. Простой пример: t1.1
запустить на R1 в течение 40, а затем t1.2
запустить на R2. Таким образом, на R2 есть пустой интервал [0, 40]
, который может быть заполнен следующим заданием.
Обновление 2: в другом вопросе SO есть интересное предложение. Если кто-то может перенести его на мою проблему и показать, что он работает для этого случая (особенно разработан для нескольких ресурсов), это, вероятно, будет правильным ответом.