Opij1sumwu — различия между версиями
(→Алгоритм) |
(→Псевдокод) |
||
Строка 12: | Строка 12: | ||
==Псевдокод== | ==Псевдокод== | ||
+ | Предполагаем, что перед началом выполнения алгоритма выполняется, что 1 \leqslant d_{1} \leqslant d_{2} \leqslant ... \leqslant d_{n}. Все работы, дедлайн которых равен 0, мы в любом случае выполнить без штрафа не успеем, поэтому их изначально можно отнести к просроченным. | ||
+ | S {{---}} множество непросроченных работ, Check {{---}} функция, решающая задачу [[Opij1di|<tex> O \mid p_{i,j} = 1, d_i \mid - </tex>]]. | ||
+ | |||
+ | |||
+ | S = <tex>\varnothing</tex>; | ||
+ | '''for''' i = 1 to n | ||
+ | S = <tex> S \cup \{i\} </tex>; | ||
+ | '''if''' ''not'' check(s) : | ||
+ | найти такое <tex>k</tex>, что <tex>w_{k} = \min \{ w_{j} \mid j \in S\}</tex>; | ||
+ | S = <tex>S \setminus \{k\}</tex>; | ||
==Доказательство корректности== | ==Доказательство корректности== |
Версия 19:15, 13 мая 2016
Задача: |
Дано | одинаковых станков, которые работают параллельно, и работ, которые необходимо выполнить в произвольном порядке на всех станках. Любая работа на любом станке выполняется за единицу времени. Для каждой работы есть время окончания — время, до которого она должна быть выполнена. Требуется минимизировать , то есть суммарный вес всех просроченных работ.
Содержание
Алгоритм
Идея алгоритма состоит в том, что на шаге
строим оптимальное решение для первых работ с наименьшими дедлайнами.Пусть работы отсортированы в порядке возрастания дедлайнов. Пусть мы уже рассмотрели первые
работ, тогда множество содержит только те работы, которые мы успеваем выполнить в порядке возрастания дедлайнов при оптимальном расписании. Рассмотрим работу . Если мы ее успеваем выполнить данную работу, до наступления дедлайна, то добавим в множество и получим множество . Если же работу мы не успеваем выполнить до дедлайна, то найдем в работу c наименьшим весом и заменим ее на работу .Таким образом, рассмотрев все работы, мы получим
— множество работ, которые мы успеваем выполнить до наступления их дедлайнов, причем вес просроченных работ будет наименьшим. От порядка выполнения просроченных работ ничего не зависит, поэтому расположить в расписании их можно произвольным образом.Псевдокод
Предполагаем, что перед началом выполнения алгоритма выполняется, что 1 \leqslant d_{1} \leqslant d_{2} \leqslant ... \leqslant d_{n}. Все работы, дедлайн которых равен 0, мы в любом случае выполнить без штрафа не успеем, поэтому их изначально можно отнести к просроченным. S — множество непросроченных работ, Check — функция, решающая задачу .
S =; for i = 1 to n S = ; if not check(s) : найти такое , что ; S = ;