Это алгоритмический вопрос о несколько сложной задаче. Основой является следующее:
Система планирования на основе доступных слотов и зарезервированных слотов. Слоты имеют определенные критерии, позволяют называть их тегами. Резервирование сопоставляется с доступным слотом этими тегами, если установленный слот слота является надмножеством зарезервированного слота.
В качестве конкретного примера возьмите этот сценарий:
11:00 12:00 13:00
+--------+
| A, B |
+--------+
+--------+
| C, D |
+--------+
Между моментами с 11:00 до 12:30 можно сделать бронирование для тегов A
и B
, с 12:00 до 13:30 C
и D
доступно, и там перекрываются с 12:00 до 12:30.
11:00 12:00 13:00
+--------+
| A, B |
+--------+
+--------+
| C, D |
+--------+
xxxxxx
x A x
xxxxxx
Здесь сделано резервирование для A
, поэтому никакие другие оговорки для A
или B
не могут быть сделаны между 11:15-иш и 12: 00-иш.
То, что идея в двух словах. Для доступных слотов нет конкретных ограничений:
- доступный слот может содержать любое количество тегов
- любое количество слотов может перекрываться в любое время Слоты
- имеют произвольную длину
- Оговорки могут содержать любое количество тегов
Единственное правило, которое должно выполняться в системе:
- при добавлении резервирования по крайней мере один оставшийся доступный слот должен соответствовать всем тегам в резерве
Чтобы уточнить: когда есть два доступных слота одновременно с, скажем, тегом A
, тогда можно сделать две оговорки для A
, но не более.
У меня есть работа с измененной реализацией дерева интервалов ; как краткий обзор:
- все доступные слоты добавляются в дерево интервалов (дубликаты/перекрытия сохраняются)
- все зарезервированные слоты повторяются и:
- все доступные слоты, соответствующие времени резервирования, запрашиваются из дерева
- первый из тех, которые соответствуют методам резервирования, нарезается, а срез удаляется из дерева
Когда этот процесс будет завершен, оставшиеся фрагменты доступных слотов останутся, и я могу запросить, можно ли сделать новое резервирование в течение определенного времени и добавить его.
Структуры данных выглядят примерно так:
{
type: 'available',
begin: 1497857244,
end: 1497858244,
tags: [{ foo: 'bar' }, { baz: 42 }]
}
{
type: 'reserved',
begin: 1497857345,
end: 1497857210,
tags: [{ foo: 'bar' }]
}
Теги сами являются объектами ключевого значения, их список - это "набор тегов". Они могут быть сериализованы, если это помогает; пока я использую тип Python set
, который делает сравнение достаточно простым. Время начала/окончания слота - это отметки времени UNIX в дереве. Я не особенно женат на этих конкретных структурах данных и могу реорганизовать их, если это полезно.
Проблема, с которой я сталкиваюсь, заключается в том, что это не работает без ошибок; время от времени оговорка пробирается в систему, которая противоречит другим оговоркам, и я еще не мог понять, как это может произойти точно. Это также не очень умно, когда теги перекрываются сложным образом, когда нужно рассчитывать оптимальное распределение, чтобы все оговорки могли максимально вписаться в доступные слоты; на самом деле в настоящее время он не детерминирован, как резервирование сопоставляется с доступными слотами в перекрывающихся сценариях.
То, что я хочу знать, это: деревья с интервалом в основном хороши для этой цели, но моя текущая система для добавления соответствия набора тегов в качестве дополнительного измерения к этому неудобна и заперта; есть ли структура данных или алгоритм, который может справиться с этим элегантным способом?
Действия, которые необходимо поддерживать:
- Запрос системы на доступные слоты, соответствующие определенным наборам тегов (с учетом резервирования, которые могут снизить доступность, но сами не являются частью указанного набора тегов, например, в примере выше запроса доступности для
B
). - Обеспечение того, что в систему не могут быть добавлены оговорки, у которых нет соответствующего слота.