PSumCi — различия между версиями
|  (→Псевдокод) |  (→Идея) | ||
| Строка 6: | Строка 6: | ||
| == Описание алгоритма == | == Описание алгоритма == | ||
| === Идея === | === Идея === | ||
| − | Пусть <tex>p_{i}</tex> заданы в порядке невозрастания (<tex>p_{ | + | Пусть <tex>p_{i}</tex> заданы в порядке невозрастания (<tex>p_{0}  \geqslant p_{1} \geqslant \ldots \geqslant p_{n-1} </tex>). Пусть теперь <tex>b_{k} = \left\lceil\dfrac{k}{m}\right\rceil</tex>. Тогда в оптимальном расписании работа с номером <tex>i</tex> будет выполнена на станке с номером <tex>i \bmod m</tex>, <tex>b_{i}</tex>-ой с конца. | 
| === Псевдокод === | === Псевдокод === | ||
Версия 19:52, 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()
Ассимптотика
Так как нам понадобится сортировка для массива , то итоговая ассимптотика будет .
Доказательство корректности
Докажем две леммы:
| Лемма: | 
| В оптимальном расписании на каждом станке работы выполняются в порядке неубывания. | 
| Доказательство: | 
| Пусть это не так. Заметим что каждая работа даёт вклад в равный . Тогда поменяем местами две работы которые нарушают порядок невозрастания. Заметим что уменьшилась. Следовательно — оптимальное расписание не оптимально. Противоречие. | 
| Лемма: | 
| В оптимальном расписании количество выполненных работ на любых двух станках отличается не более чем на . | 
| Доказательство: | 
| Пусть это не так. Как было отмечено в предыдущей лемме, каждая работа даёт вклад в равный . Найдём два станка количество работ на которых отличается больше чем на . Пусть это станки и . Причём на стнаке выполняется больше работ. Тогда если отправить первую с начала работу со станка на станок то уменьшится на разность количества работ на станках и . Следовательно — оптимальное расписание не оптимально. Противоречие. | 
| Теорема: | 
| Алгоритм  строит оптимальное расписание. | 
| Доказательство: | 
| Пусть это не так и оптимальное расписание отличается от расписания построенного алгоритмом. Заметим что расписание построенное алгоритмом удовлетворяет обеим леммам. Тогда можно воспользоваться одной из них чтобы улучшить оптимальное раписание. Следовательно — оптимальное расписание не оптимально. Противоречие. | 
