Алгоритм назначения одной встречи в уже полном расписании - PullRequest
0 голосов
/ 08 мая 2020

Я создаю приложение календарного планирования, скажем, для сантехнической компании. В компании есть один или несколько сантехников, у каждого из которых график встреч в разное время в течение дня. Итак, график Джо sh на 30 мая может включать 30-минутную встречу в 10:00, 45-минутную встречу в 13:00 и часовую встречу в 15:00, в то время как у Марии в этот день совершенно другой график. . Теперь предположим, что клиент хочет записаться на прием в эту компанию, и моя программа уже рассчитала время, которое займет эта новая встреча. Я хочу, чтобы моя программа возвращала список возможных часов приема для любого сантехника. Есть ли стандартный алгоритм для этого типа проблемы?

Я бы предпочел language-agnosti c, общие шаги, чтобы быть более полезными для всех, кто может оказаться в аналогичной ситуации с другим языком, хотя Я использую PHP и PostgreSQL, если есть специальная языковая функция c, подходящая для этого.

Вот что я пробовал до сих пор:

  1. Получить все доступные смены для каждого сантехника в запрошенный день
  2. Получить все встречи, уже назначенные в этот день
  3. Сделайте своего рода логическое вычитание, чтобы сократить встречи из смен, оставив пробелы в расписании каждого сантехника
  4. Избавьтесь от всех пропусков в расписании, которые меньше запрошенной продолжительности встречи (я также рассчитываю время в пути, чтобы знать, насколько далеко должны быть встречи друг от друга)
  5. Верните эти пропуски в клиент, обрезанный до продолжительности встречи, как возможности встречи

Я узнал, что проблема с этим подходом заключается в том, что я t не понимает, что делать с перерывом, намного большим, чем запрошенная встреча. Если у вас перерыв с 10:00 до 18:00, но вам нужна часовая встреча, вам будет предложено только 10:00 до 11:00. Этот подход также не позволяет выбирать время суток. Что делать, если клиент хочет назначить встречу утром? Тогда он должен предлагать только 10-11 и 11-12. Или, если они хотят назначить вечернюю встречу, она должна предлагать только 5-6 часов вечера. Этот подход также не учитывает двух сантехников, работающих вместе. Если мы предположим, что двое рабочих составляют половину рабочего времени, тогда, возможно, алгоритм должен искать те же 30 минут, которые доступны в расписаниях Джо sh и Марии, а также 60-минутные перерывы в расписании любого сантехника. Наконец, этот алгоритм кажется очень неэффективным.

Кстати, я рассмотрел несколько других вопросов здесь и вокруг Inte rnet о том, как решать подобные ситуации, но я нахожу, что большинство (если не все) из этих вопросов связаны с оптимизацией расписания. Это может быть полезно для других частей этой программы, но пока давайте предположим, что существующие встречи являются фиксированными и неизменными. Мы просто хотим вписать новую встречу в существующий график. Я знаю, что это возможно, потому что такие приложения, как Calendly, имеют схожие входы и выходы.

Короче говоря, есть ли лучший способ достичь этих целей:

  • Предложите имеющиеся пробелы в расписании одного сантехника с учетом временного интервала
  • Если возможно, возвращайтесь только в указанное время дня (утро = 4-12, полдень = 12-5, вечер = 5-10, ночь = 10-4 или любое другое ), и, если это невозможно, продолжите алгоритм, как если бы время суток не было указано
  • Предложите меньшие промежутки, где n сантехников могли бы выполнить работу за 1 / n раз (сантехников не так много, поэтому устанавливать ограничение на это не нужно). Это не так важно, как другие критерии, поэтому, если это невозможно или может значительно усложнить алгоритм, не беспокойтесь об этом.
  • Разделите большие промежутки времени между встречами на меньшие промежутки, чтобы мы может предложить 4-часовой перерыв между 10:00 и 14:00. Очевидно, мы не можем предложить все возможные часовые сегменты этого промежутка, потому что они были бы бесконечными.

Заранее спасибо.

1 Ответ

1 голос
/ 08 мая 2020

Нет необходимости в сложном алгоритме. Есть лишь небольшое количество возможных встреч в течение дня, скажем, каждые 30 минут или около того. Перебирать все возможные времена: 06:00, 06:30, 07:00, ... 20:00. Проверяйте каждый раз, соответствует ли он требованиям, эта проверка может либо вернуть результат да / нет, либо число, которое говорит, насколько хорошее совпадение это время. В итоге вы получите список возможных назначений, выберите лучшее или все из них.

...