Есть N водопроводчиков и M рабочих мест для них, где M> N в целом.Назначение рабочих мест работникам
Если N> М, тогда пришло время увольнений! :)
Свойства работы:
- Каждая работа должна быть выполнена в определенном временном окне, которое может изменяться за работу.
- Расположение каждого задания зависит от работы.
- Некоторые работы требуют особого мастерства. Навыки, необходимые для выполнения задания, могут варьироваться в зависимости от заданий
- Некоторые задания имеют более высокий приоритет, чем другие. «Награда» за некоторые рабочие места выше, чем у других.
Свойства водопроводчика:
- сантехников должны ездить с одной работы на другую, которая занимает много времени. Скажите, что известно, что время в пути от каждой работы до каждого другого места работы.
- Некоторые водопроводчики обладают навыками, которые другие не имеют.
Задача состоит в том, чтобы найти оптимальное назначение работ сантехникам, чтобы вознаграждение было максимально.
Возможно, что не все задания могут быть завершены. Например, с одним сантехником и двумя рабочими местами, возможно, что если они выполняют работу A, они не могут выполнять работу B, потому что не хватает времени, чтобы добраться от A до B, как только они закончите с A и B, , В этом случае оптимальным является то, что водопроводчик выполняет работу с самой большой наградой, и мы закончили.
Я имею в виду жадный алгоритм, который работает следующим образом:
sort jobs by reward
while true:
for each job:
find plumbers that could potentially handle this job
make a note of the association, used in next loop
if each plumber is associated with a different job, break
for each job that can be handled by a plumber:
assign job to a plumber:
if more than one plumber can handle this job, break tie somehow:
for instance if plumber A can do jobs X,Y but
plumber B can only do X, then give X to B.
else just pick a plumber to take it
remove assigned job from further consideration
if no jobs got assigned:
break out of "while true" loop
Мой вопрос: есть ли лучший способ? Похоже на NP-трудную проблему, но у меня нет доказательств этого. :)
Я думаю, это похоже на Assignment Problem.
Кажется, что это немного по-другому, хотя из-за пространства/времени морщины: водопроводчик мог делать либо A, либо B, но не оба из-за расстояния между ними (не может добраться до B после окончания A). И задания должны быть завершены в определенные временные окна.
Также водопроводчик не может выполнять обе работы, если они слишком близки по времени (даже если они близки в пространстве). Например, если B необходимо запустить до времени_A_finished + time_to_travel_A_to_B, тогда B не может быть сделано после A.
Спасибо за любые идеи! Любые указатели на хорошие вещи для чтения в этой области также приветствуются.
Как [проблема с магазином] (https://en.wikipedia.org/wiki/Job_shop_scheduling). – user3386109