PSumCi — различия между версиями
(→Доказательство корректности) |
(→Доказательство корректности) |
||
| Строка 26: | Строка 26: | ||
|id=lemma1 | |id=lemma1 | ||
|statement= В оптимальном расписании на каждом станке работы выполняются в порядке неубывания времён выполнения. | |statement= В оптимальном расписании на каждом станке работы выполняются в порядке неубывания времён выполнения. | ||
| − | |proof= Пусть это не так. Заметим что | + | |proof= Пусть это не так. Заметим что <tex>\sum C_{i} = \sum p_{i} \cdot (b_{i} + 1)</tex>. Следовательно каждая работа даёт вклад равный <tex>p_{i} \cdot (b_{i} + 1)</tex>. Тогда поменяем местами две работы которые нарушают порядок невозрастания. Заметим что <tex>\sum C_{i}</tex> уменьшилась. Следовательно {{---}} оптимальное расписание не оптимально. Противоречие.}} |
{{Лемма | {{Лемма | ||
Версия 20:09, 4 июня 2016
| Задача: |
| Дано работ с заданными временами выполнения . И параллельных станков с одинаковой скоростью выполнения работ. Цель — составить такое расписание, чтобы суммарное время окончания всех работ было минимальным. |
Содержание
Описание алгоритма
Идея
Пусть заданы в порядке невозрастания (). Пусть теперь . Тогда в оптимальном расписании работа с номером будет выполнена на станке с номером , -ой с конца.
Псевдокод
Здесь предполагается что работы отсортирован в порядке неубывания времён выполнения.
list<int> schedule[m] //Заведём список работ для каждого станка. Ответ будет храниться в нём.
for i = 0 to n
schedule[i mod m].push(i) //ставим работу с номером i на станок i mod m в конец.
//Заметим что расписание для каждого станка получилось перевёрнутым
//Поэтому развернём расписание для каждого станка.
for i = 0 to m
schedule[i].reverse()
Ассимптотика
Так как нам понадобится сортировка для массива , то итоговая ассимптотика будет .
Доказательство корректности
Докажем две леммы:
| Лемма: |
В оптимальном расписании на каждом станке работы выполняются в порядке неубывания времён выполнения. |
| Доказательство: |
| Пусть это не так. Заметим что . Следовательно каждая работа даёт вклад равный . Тогда поменяем местами две работы которые нарушают порядок невозрастания. Заметим что уменьшилась. Следовательно — оптимальное расписание не оптимально. Противоречие. |
| Лемма: |
В оптимальном расписании количество выполненных работ на любых двух станках отличается не более чем на . |
| Доказательство: |
| Пусть это не так. Как было отмечено в предыдущей лемме, каждая работа даёт вклад в равный . Найдём два станка количество работ на которых отличается больше чем на . Пусть это станки и . Причём на стнаке выполняется больше работ. Тогда если отправить первую с начала работу со станка на станок то уменьшится на разность количества работ на станках и . Следовательно — оптимальное расписание не оптимально. Противоречие. |
| Теорема: |
Алгоритм строит оптимальное расписание. |
| Доказательство: |
| Пусть это не так и оптимальное расписание отличается от расписания построенного алгоритмом. Заметим что расписание построенное алгоритмом удовлетворяет обеим леммам. Тогда можно воспользоваться одной из них чтобы улучшить оптимальное раписание. Следовательно — оптимальное расписание не оптимально. Противоречие. |