Я ищу алгоритм (и, надеюсь, реализацию .net), который может делать следующее: У меня есть следующие данные:
- список технических специалистов, каждый из которых имеет разные навыки (может быть больше одного).
- временное окно обслуживания (например, 8-12)
- список всех ранее запланированных заданий в пределах этого временного окна (каждый со своими необходимыми навыками)
учитывая новую работу (с необходимыми навыками), я должен проверить, есть ли новая работа, и быть назначен любому из доступных технических специалистов (предыдущие рабочие места могут быть перемещены между техническими специалистами, если их навыки поддерживают это). также нельзя превышать временное окно обслуживания, поэтому 1-часовое задание не может быть запланировано на 11:30.
Первоначально я думал о том, чтобы сделать вариант FFD для упаковки в контейнеры, где я предварительно загружал контейнеры (технические специалисты), и при поиске контейнера для размещения работы я также проверял соответствие навыков. Список заданий будет содержать все предыдущие задания и новое (отсортированное по убыванию по размеру), и либо код останавливается, потому что задание не может быть помещено в какой-либо лоток, либо он завершается после того, как все задания были запланированы.
Теоретически это могло сработать, но потом я подумал о следующем сценарии:
- Техники: T1 (с навыками S1 и S2), T2 (с навыками S2 и S3)
- Предыдущие задания: J1 (требуется навык S2), Продолжительность всего временного окна.
- Новое задание J2 (требуется навык S1)
Может случиться так, что J1 назначен на T1, и тогда J2 не будет места.
Поэтому я подумал о добавлении второй сортировки в список заданий: задания будут отсортированы по убыванию размера, а затем по количеству ресурсов, которые действительно могут выполнять их по возрастанию. Это поставит J2 на первое место, так как это сможет сделать меньше технических специалистов.
Есть ли конкретный алгоритм решения этой проблемы или мой подход достаточно хорош?
Спасибо