PSumCi — различия между версиями
(→Доказательство корректности) |
(→Псевдокод) |
||
Строка 9: | Строка 9: | ||
=== Псевдокод === | === Псевдокод === | ||
− | + | Итоговым расписанием будет массив <tex>schedule</tex> где в <tex>schedule[i][j]</tex> храниться номер работы которую надо исполнить на станке номер <tex>i</tex>, <tex>j</tex>-ой по счёту. | |
− | list<int> schedule[m] <font color=green> //Заведём список работ для каждого станка. Ответ будет храниться в нём.</font> | + | '''function''' getSchedule(jobs : int[n]): <font color=green>// jobs - массив номеров работ отсортированных в порядке невозрастания p[i].</font> |
− | + | list<int> schedule[m] <font color=green> // Заведём список работ для каждого станка. Ответ будет храниться в нём.</font><br> | |
− | + | '''for''' i = 0 '''to''' n | |
− | + | schedule[i mod m].push(jobs[i]) <font color=green>// Cтавим i-ую в порядке уменьшения p[i] работу на станок i mod m в конец.</font><br> | |
− | + | <font color=green>// Заметим что расписание для каждого станка получилось перевёрнутым.<br> // Поэтому развернём расписание для каждого станка.</font> | |
− | + | '''for''' i = 0 '''to''' m | |
+ | schedule[i].reverse()<br> | ||
+ | '''return''' schedule | ||
=== Ассимптотика === | === Ассимптотика === |
Версия 21:44, 4 июня 2016
Задача: |
Дано Цель — составить такое расписание, чтобы суммарное время окончания всех работ было минимальным. | работ с заданными временами выполнения и параллельных станков с одинаковой скоростью выполнения работ.
Содержание
Описание алгоритма
Идея
Пусть
заданы в порядке невозрастания ( ). Пусть теперь . Тогда в оптимальном расписании работа с номером будет выполнена на станке с номером , -ой с конца.Псевдокод
Итоговым расписанием будет массив
где в храниться номер работы которую надо исполнить на станке номер , -ой по счёту.function getSchedule(jobs : int[n]): // jobs - массив номеров работ отсортированных в порядке невозрастания p[i]. list<int> schedule[m] // Заведём список работ для каждого станка. Ответ будет храниться в нём.
for i = 0 to n schedule[i mod m].push(jobs[i]) // Cтавим i-ую в порядке уменьшения p[i] работу на станок i mod m в конец.
// Заметим что расписание для каждого станка получилось перевёрнутым.
// Поэтому развернём расписание для каждого станка. for i = 0 to m schedule[i].reverse()
return schedule
Ассимптотика
Так как нам понадобится сортировка для массива , то итоговая ассимптотика будет .
Доказательство корректности
Докажем две леммы:
Лемма: |
В оптимальном расписании на каждом станке работы выполняются в порядке неубывания времён выполнения. |
Доказательство: |
Пусть это не так. Заметим что | . Следовательно каждая работа даёт вклад равный . Тогда поменяем местами две работы которые нарушают порядок невозрастания. Заметим что уменьшилась. Следовательно — оптимальное расписание не оптимально. Противоречие.
Лемма: |
В оптимальном расписании количество выполненных работ на любых двух станках отличается не более чем на . |
Доказательство: |
Пусть это не так. Как было отмечено в предыдущей лемме, каждая работа даёт вклад в | равный . Найдём два станка количество работ на которых отличается больше чем на . Пусть это станки и . Причём на стнаке выполняется больше работ. Тогда если отправить первую с начала работу со станка на станок то уменьшится на разность количества работ на станках и . Следовательно — оптимальное расписание не оптимально. Противоречие.
Теорема: |
Алгоритм строит оптимальное расписание. |
Доказательство: |
Пусть это не так и оптимальное расписание отличается от расписания построенного алгоритмом. Заметим что расписание построенное алгоритмом удовлетворяет обеим леммам. Тогда можно воспользоваться одной из них чтобы улучшить оптимальное раписание. Следовательно — оптимальное расписание не оптимально. Противоречие. |
Источники информации
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 22