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 = ;