Введение
Я хотел бы реализовать динамическую очередь с временной шкалой. Контекст здесь планирование в целом.
Что такое очередь времени?
Это все еще просто: это временная шкала задач, где каждое событие имеет свое начало и время окончания. Задачи сгруппированы как рабочие места. Эта группа задач должна сохранять свой порядок, но может быть перемещена во времени в целом. Например, он может быть представлен как:
--t1-- ---t2.1-----------t2.2-------
' ' ' ' '
20 30 40 70 120
Я бы выполнил это как очередь кучи с некоторыми дополнительными ограничениями. Модуль Python sched
имеет некоторые базовые подходы в этом направлении.
Определение очереди с несколькими таймингами
Одна очередь означает ресурс, а ресурс нужен задаче. Графический пример:
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--
Функциональность (в порядке приоритета)
- FirstFreeSlot (продолжительность, начало). Найдите первый свободный временной интервал, начинающийся с
start
, где есть свободное время дляduration
(см. подробное объяснение в конце). - Завершить задание как можно скорее на нескольких ресурсах, рассматривая ограничения (в основном: правильный порядок задач, последовательные задачи на одном ресурсе) и используя
FirstFreeSlot
. - Поместите задание в определенное время и переместите хвост назад
- Удалить задание
- Пересчитать. После удаления проверьте, выполняются ли некоторые задачи раньше.
Ключевой вопрос
Дело в следующем: как я могу представить эту информацию, чтобы обеспечить функциональность эффективно? Реализация зависит от меня;-)
Обновление. Еще один момент для рассмотрения: типичные интервальные структуры сосредоточены на "Что находится в точке X?". Но в этом случае enqueue
и, следовательно, вопрос "Где первый пустой слот для продолжительности D?" гораздо важнее. Поэтому дерево сегментов/интервалов или что-то еще в этом направлении, вероятно, не является правильным выбором.
Чтобы подробнее разобраться с свободными слотами: из-за того, что у нас есть несколько ресурсов и ограничение сгруппированных задач, на некоторых ресурсах могут быть свободные временные интервалы. Простой пример: t1.1
выполняется на R1 для 40, а затем t1.2
выполняется на R2. Таким образом, на R2 существует пустой интервал [0, 40]
, который может быть заполнен следующим заданием.
Обновление 2. В другом вопросе SO есть интересное предложение . Если кто-то может перенести его на мою проблему и показать, что он работает для этого случая (особенно для нескольких ресурсов), это, вероятно, правильный ответ.