Изоморфные проблемы решены.Я предполагаю, что для выполнения каждой задачи требуются определенные усилия, и что работники взаимозаменяемы: например, Пол сможет завершить задачу № 17 ровно за то же время, что и Эбби.
При этом получается планированиебыть тривиальным: вычислить «самое позднее время начала» (LST) для каждой задачи, крайний срок минус требуемые усилия.Например, задание, которое занимает 4 часа и должно быть выполнено в 18:00, имеет LST 14:00.
вызывает число доступных работников N+1
, где +1
является включенным.Требуется работник.
Сортировка задач по LST и назначение их N
доступных работников в указанном порядке.Заполните расписание с очевидными интервалами: по мере того, как каждый работник завершает текущую задачу, назначьте следующую доступную задачу.
Если вы достигли точки в расписании, где у вас есть LST без назначенного работника, поместите его вочередь для работника по требованию, N+1
.Когда вы дойдете до конца, если у работника N+1
больше задач, чем у него есть время, то у вас нет решения.
Например, при 2 + 1 работниках и задачах
Due Effort LST (computed from input)
A 5 3 2
B 3 2 1
C 1 1 0
D 5 2 3
E 4 3 1
Сортировка списка по LST
Due Effort LST
C 1 1 0
E 4 3 1
B 3 2 1
A 5 3 2
D 5 2 3
Теперь мы начинаем планировать расписание для каждого работника по часам
0 1 2 3 4
#1 C B B
#2 E E E
. В этот момент мы видим, что задача A должна быть запущена, нодва нормальных рабочих уже заняты.Мы должны присвоить что-то # 3.Перегрузка для промежутка задания составляет 1 час (на самом деле, это перегрузка всего расписания), поэтому поменяйте 1-часовое задание на # 3 и запустите задание «перегрузка» на его LST (это уменьшит количество возвратов и повторных запросов)пытается в сложной ситуации).
0 1 2 3 4
#1 B B A A A
#2 E E E
#3 C
Теперь задача D
легко назначается на # 2, и мы закончили.
Это заставляет вас двигаться?