Алгоритм планирования временных окон техником

Я ищу алгоритм (и, надеюсь, реализацию .net), который может делать следующее: У меня есть следующие данные:

  1. список технических специалистов, каждый из которых имеет разные навыки (может быть больше одного).
  2. временное окно обслуживания (например, 8-12)
  3. список всех ранее запланированных заданий в пределах этого временного окна (каждый со своими необходимыми навыками)

учитывая новую работу (с необходимыми навыками), я должен проверить, есть ли новая работа, и быть назначен любому из доступных технических специалистов (предыдущие рабочие места могут быть перемещены между техническими специалистами, если их навыки поддерживают это). также нельзя превышать временное окно обслуживания, поэтому 1-часовое задание не может быть запланировано на 11:30.

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

Теоретически это могло сработать, но потом я подумал о следующем сценарии:

  • Техники: T1 (с навыками S1 и S2), T2 (с навыками S2 и S3)
  • Предыдущие задания: J1 (требуется навык S2), Продолжительность всего временного окна.
  • Новое задание J2 (требуется навык S1)

Может случиться так, что J1 назначен на T1, и тогда J2 не будет места.

Поэтому я подумал о добавлении второй сортировки в список заданий: задания будут отсортированы по убыванию размера, а затем по количеству ресурсов, которые действительно могут выполнять их по возрастанию. Это поставит J2 на первое место, так как это сможет сделать меньше технических специалистов.

Есть ли конкретный алгоритм решения этой проблемы или мой подход достаточно хорош?

Спасибо


person Dani Avni    schedule 30.04.2015    source источник
comment
Мне это кажется классической проблемой планирования занятий, когда технические специалисты являются учителями (которые могут преподавать несколько предметов). Это проблема NP-Hard. Некоторые связанные вопросы, которые решили это путем сокращения до SAT и использования SAT Solver: Планирование классов до логической выполнимости, [часть 1], [часть 2], [ часть 3]. Хотя это и не обман, эти подходы также могут вам помочь.   -  person amit    schedule 30.04.2015
comment
В отличие от расписания занятий, его технические специалисты могут начать работу только в какой-то момент времени во время интервалов обслуживания. Не только полчаса. Превращает ли это проблема в упаковку блоков разного цвета в коробку длиной L (срок службы 8-12)?   -  person BitTickler    schedule 30.04.2015
comment
на самом деле это только первая часть нашей системы. Клиент звонит в справочный центр и просит прислать специалиста. Справочный центр должен назначить технического специалиста в зависимости от необходимых навыков и доступности. Итак, вам говорят, что техник приедет в понедельник с 8 до 12. Мы пока не знаем, кто будет техником, и никому не поручаем эту задачу. Мы просто занимаем место в расписании. и единственные данные, которые у нас есть, - это сколько у нас будет техников по каждому набору навыков в понедельник. накануне -воскресенье мы проводим оптимизацию маршрута для всех доступных техников и всех работ (эта часть уже сделана и работает)   -  person Dani Avni    schedule 30.04.2015
comment
Что делать, если ни один работник в пуле не обладает всеми навыками, необходимыми для работы? Вы отправляете более одного работника?   -  person BitTickler    schedule 30.04.2015
comment
Если ни один технический специалист не имеет необходимых навыков, код решит, что это временное окно не подходит, и попробует другое временное окно (возможно, в нем доступны другие специалисты). Если временное окно не найдено, справочный центр должен будет решить, что делать. Мы не собираемся быть полноценной системой планирования временных окон. Мне нужно предоставить достаточно хорошее решение для большинства наших пользователей. Если некоторые не могут использовать эту часть нашего приложения, они всегда могут обратиться к профессиональной системе планирования и использовать нашу систему для остальных (оптимизация маршрута и другие функции, которые у нас есть).   -  person Dani Avni    schedule 30.04.2015


Ответы (1)


Взгляните на Проблемы удовлетворения ограничений. Ваша проблема попадает в эту категорию.

Кроме того, для быстрого обзора класса проблемы и некоторых игрушечных примеров посмотрите здесь < / а>.

Это (общедоступная) глава, из которой были взяты слайды.

Вам понадобятся следующие ограничения (написанные неформально):

  1. Проблема требует набора навыков для решения.
  2. У проблемы есть временное окно, которое необходимо решить.
  3. Проблема может быть поручена технику только в том случае, если техник обладает всеми необходимыми навыками.
  4. Проблема может быть назначена технику только в том случае, если у техника есть временной интервал, превышающий или равный времени, необходимому для решения проблемы.

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

person Gentian Kasa    schedule 30.04.2015
comment
Поскольку моя единственная забота - сжать все существующие задания + новое во временном окне, могу ли я предположить, что модель для такого CSP будет чем-то вроде: 1 переменная решения на задание (какая технология это делает), ограничения следующие: сумма длины работы на одного технолога ‹= размер временного окна, все работы выполняются техником с правильными навыками. Я прав? Я только что скачал их SDK с solver.com. надеюсь, что достаточно легко научиться использовать его в качестве решателя - person Dani Avni; 30.04.2015
comment
Я отредактировал ответ, чтобы добавить некоторые ограничения, которые возникли у меня в голове. Что касается упомянутого вами SDK, я ничего не могу сказать, потому что, когда мне удалось решить аналогичную проблему, я не использовал никаких внешних SDK или API. - person Gentian Kasa; 30.04.2015