Приложение для планирования ресурсов - PullRequest
1 голос
/ 08 октября 2009

Я пытаюсь реализовать приложение, которое координирует нескольких пользователей, которые планируют эксклюзивные ресурсы. Данные расписания должны поддерживать строгую согласованность в сети с одним главным узлом. Запланированные ресурсы могут быть любыми: от конференц-зала до работника на рабочем месте.

Мы предполагаем, что в конференц-зале нельзя запланировать две встречи одновременно, и работник не может одновременно находиться на двух рабочих местах. Бизнес-логика приложения не должна позволять пользователю «перебирать» ресурс.

Что я не могу понять, так это как представлять данные так, чтобы, если два или более пользователей работали по расписанию одновременно и возникали конфликты, одно из обновлений будет прервано.

Единственное решение, которое я видел до сих пор, - это отслеживание временных интервалов для каждого исключающего ресурса. Таким образом, если конференц-зал используется с 5-минутными интервалами, и он был запланирован на 9-9:30, то соответствующие 5-минутные временные интервалы для 9-9:30 будут возвращать TRUE, тогда как незапланированные интервалы будут возвращать FALSE или NULL. , Транзакция БД будет затем вытаскивать объект конференц-зала из хранилища, проверять все временные интервалы и прерывать работу, если обновление конфликтует с существующими временными интервалами.

Однако, похоже, что он станет очень большим, очень быстрым. Возможно, это может быть мусор? Кроме того, одной из целей проекта является поддержка переменной гранулярности, поэтому некоторые объекты будут планироваться по минутам, а другие - ежедневно, и этот дизайн данных не очень хорошо это поддерживает.

В настоящее время я пытаюсь реализовать это на Google App Engine с использованием Python, но мне было бы очень интересно увидеть более общие решения этой проблемы. Все, что я придумал, - это планирование повторяющихся задач или алгоритмы, которые выполняют одноразовые операции для автоматического создания оптимизированных расписаний.

Ответы [ 2 ]

3 голосов
/ 08 октября 2009

Вы хотите отслеживать только время начала и окончания для каждого исключающего ресурса. Хранение данных в вашей задаче на самом деле является легкой частью - сложная (er) часть создает запросы для поиска конфликтов во временных интервалах.

Если моя логика верна после 21 часа работы, следующий псевдо-код должен проверять конфликты собраний.

# Set up your proposed meeting
proposed.start = <thursday, 1pm>
proposed.end   = <thursday, 2pm>

# Look for meetings that intersect with or straddle proposed meeting
conflicts = <SELECT * FROM meeting WHERE
             meeting.start BETWEEN proposed.start AND proposed.end OR
             meeting.end   BETWEEN proposed.start AND proposed.end OR
             meeting.start <= proposed.start AND meeting.end >= proposed.end>


if conflicts.length > 0:
   # We have a conflict!
1 голос
/ 10 января 2010

Чтобы автоматически оптимизировать расписание школы или университета (или даже других проблем), взгляните на следующие инструменты Java:

TimeFinder , UniTime или Drools Solver

Проблема с взаимодействием с пользователем не так легко решается, как вы объяснили, я думаю, потому что могут быть и другие нарушения ограничений (временная таблица может стать намного более сложной).

Во-первых, я бы разрешил только планировщикам получать доступ к данным расписания / изменять их.

Во-вторых, я бы создал независимое решение для каждого планировщика, а затем оптимизировал бы это решение с помощью предложенных выше инструментов. Затем решения могут быть сохранены в базе данных, и планировщик может использовать их для дальнейшей оптимизации расписания или сравнения с другими решениями.

...