Fpij1sumwu — различия между версиями
(Новая страница: «==Описание задачи== Дано <tex>m</tex> станков, на которых нужно обработать <tex>n</tex> деталей. Кажд...») |
|||
Строка 13: | Строка 13: | ||
После устранения каждого разрыва получим расписание без разрывов, в котором каждая работа заканчивает выполняться не позже, чем в изначальном. | После устранения каждого разрыва получим расписание без разрывов, в котором каждая работа заканчивает выполняться не позже, чем в изначальном. | ||
}} | }} | ||
+ | |||
+ | По этому утверждению, если работу <tex>i</tex> начали делать в <tex>t(i)</tex>, то закончена она будет в <tex>t(i)+m</tex>. Найдем время <tex>d'_i</tex> такое, что начав выполнять в него работу <tex>i</tex>, мы успеем выполнить ее до <tex>d_i</tex>: <tex>d'_i = d_i - m</tex>. Таким образом, вычтя из всех <tex>d_i</tex> число <tex>m</tex>, мы свели задачу к <tex>1 \mid p_i = 1 \mid \sum w_i u_i</tex>. | ||
+ | |||
+ | Построив оптимальное расписание для <tex>1 \mid p_i = 1 \mid \sum w_i u_i</tex>, мы найдем времена, в которые нужно начинать выполнять работы. По утверждению выше, работы можно выполнять непрерывно. | ||
+ | |||
+ | ==Сложность алгоритма== | ||
+ | Задача <tex>F \mid p_{ij} = 1 \mid \sum w_iu_i</tex> за <tex>O(n)</tex> сводится к задаче <tex>1 \mid p_i = 1 \mid \sum w_iu_i</tex>. Задача <tex>1 \mid p_i = 1 \mid \sum u_iw_i</tex> решается за <tex>O(n \log n)</tex>. После решения этой задачи, нужно вывести ответ, имеющий размер <tex>O(nm)</tex>. Значит, итоговая сложность алгоритма {{---}} <tex>O(n \log n + nm)</tex>. |
Версия 15:27, 18 июня 2012
Описание задачи
Дано
станков, на которых нужно обработать деталей. Каждую деталь нужно обработать по очереди на всех станках. Любая работа на любом станке выполняется единицу времени. Для каждой работы есть дедлайн — время, до которого она должна быть закончена, и штраф , который нужно будет выплатить в случае, если работа была закончена после . Необходимо минимизировать суммарный штраф, который придется выплатить.Описание алгоритма
Утверждение: |
Существует оптимальное расписание, в котором каждая работа делается непрерывно. |
Рассмотрим расписание, в котором есть работы, которые делаются не непрерывно. Рассмотрим самый ранний разрыв: работа делалась в моменты , где , но не делалась в момент времени . Докажем, что в момент времени , -й станок простаивает и можно продолжить делать -ю работу.Пусть в момент времени После устранения каждого разрыва получим расписание без разрывов, в котором каждая работа заканчивает выполняться не позже, чем в изначальном. на -м станке делается работа . В -й момент времени -й станок был занят выполнением -й работы, а значит, не мог выполнять -ю. Значит, разрыв был раньше, что противоречит тому, что был выбран самый ранний разрыв. Значит, в -й момент -й станок свободен и туда можно поставить -ю работу, устранив разрыв. |
По этому утверждению, если работу
начали делать в , то закончена она будет в . Найдем время такое, что начав выполнять в него работу , мы успеем выполнить ее до : . Таким образом, вычтя из всех число , мы свели задачу к .Построив оптимальное расписание для
, мы найдем времена, в которые нужно начинать выполнять работы. По утверждению выше, работы можно выполнять непрерывно.Сложность алгоритма
Задача
за сводится к задаче . Задача решается за . После решения этой задачи, нужно вывести ответ, имеющий размер . Значит, итоговая сложность алгоритма — .