PSumCi — различия между версиями
(→Источники информации) |
м (rollbackEdits.php mass rollback) |
||
(не показано 8 промежуточных версий 2 участников) | |||
Строка 9: | Строка 9: | ||
=== Псевдокод === | === Псевдокод === | ||
− | + | Итоговым расписанием будет массив <tex>\mathtt{schedule}</tex> где в <tex>\mathtt{schedule[i][j]}</tex> храниться номер работы которую надо исполнить на станке номер <tex>i</tex>, <tex>j</tex>-ой по счёту. | |
− | list<int> schedule[m] <font color=green> //Заведём список работ для каждого станка. Ответ будет храниться в нём.</font> | + | '''function''' getSchedule(p : '''int'''[n]): '''list'''<'''int'''>[m] |
− | + | '''Pair'''<'''int''','''int'''> jobs[n] | |
− | + | '''for''' i = 0 '''to''' n | |
− | + | jobs[i] = <tex>\langle</tex>p[i], i<tex>\rangle</tex> <font color=green>// Создаём пары для востановления номера работы после сортировки.</font> | |
− | + | sort(jobs) <font color=green>// Cортируем массив в порядке уменьшения p[i].</font><br> | |
− | + | '''list'''<'''int'''> schedule[m] <font color=green> // Заведём список работ для каждого станка. Ответ будет храниться в нём.</font> | |
+ | '''for''' i = 0 '''to''' n | ||
+ | schedule[i mod m].pushFront(jobs[i].second) <font color=green>// Cтавим i-ую в порядке уменьшения p[i] работу на станок i mod m в конец.</font><br> | ||
+ | '''return''' schedule | ||
=== Ассимптотика === | === Ассимптотика === | ||
Строка 26: | Строка 29: | ||
|id=lemma1 | |id=lemma1 | ||
|statement= В оптимальном расписании на каждом станке работы выполняются в порядке неубывания времён выполнения. | |statement= В оптимальном расписании на каждом станке работы выполняются в порядке неубывания времён выполнения. | ||
− | |proof= Пусть это не так. Заметим что <tex>\sum C_{i} = \sum p_{i} \cdot b_{i}</tex>. Следовательно каждая работа даёт вклад равный <tex>p_{i} \cdot b_{i}</tex>. Тогда поменяем местами две работы которые нарушают порядок невозрастания. Заметим что <tex>\sum C_{i}</tex> уменьшилась. Следовательно {{---}} оптимальное расписание не оптимально. Противоречие.}} | + | |proof= Пусть это не так. Заметим что <tex>\sum\limits_{i=0}^{n-1} C_{i} = \sum\limits_{i=0}^{n-1} p_{i} \cdot b_{i}</tex>. Следовательно каждая работа даёт вклад равный <tex>p_{i} \cdot b_{i}</tex>. Тогда поменяем местами две работы которые нарушают порядок невозрастания. Заметим что <tex>\sum\limits_{i=0}^{n-1} C_{i}</tex> уменьшилась. Следовательно {{---}} оптимальное расписание не оптимально. Противоречие.}} |
{{Лемма | {{Лемма | ||
|id=lemma2 | |id=lemma2 | ||
|statement= В оптимальном расписании количество выполненных работ на любых двух станках отличается не более чем на <tex>1</tex>. | |statement= В оптимальном расписании количество выполненных работ на любых двух станках отличается не более чем на <tex>1</tex>. | ||
− | |proof= Пусть это не так. Как было отмечено в предыдущей лемме, каждая работа даёт вклад в <tex>\sum C_{i}</tex> равный <tex>p_{i} \cdot b_{i}</tex>. Найдём два станка количество работ на которых отличается больше чем на <tex>1</tex>. Пусть это станки <tex>x</tex> и <tex>y</tex>. Причём на стнаке <tex>x</tex> выполняется больше работ. Тогда если отправить первую с начала работу со станка <tex>x</tex> на станок <tex>y</tex> то <tex>\sum C_{i}</tex> уменьшится на разность количества работ на станках <tex>x</tex> и <tex>y</tex>. Следовательно {{---}} оптимальное расписание не оптимально. Противоречие.}} | + | |proof= Пусть это не так. Как было отмечено в предыдущей лемме, каждая работа даёт вклад в <tex>\sum\limits_{i=0}^{n-1} C_{i}</tex> равный <tex>p_{i} \cdot b_{i}</tex>. Найдём два станка количество работ на которых отличается больше чем на <tex>1</tex>. Пусть это станки <tex>x</tex> и <tex>y</tex>. Причём на стнаке <tex>x</tex> выполняется больше работ. Тогда если отправить первую с начала работу со станка <tex>x</tex> на станок <tex>y</tex> то <tex>\sum\limits_{i=0}^{n-1} C_{i}</tex> уменьшится на разность количества работ на станках <tex>x</tex> и <tex>y</tex>. Следовательно {{---}} оптимальное расписание не оптимально. Противоречие.}} |
{{Теорема | {{Теорема | ||
Строка 38: | Строка 41: | ||
|proof= Пусть это не так и оптимальное расписание отличается от расписания построенного алгоритмом. Заметим что расписание построенное алгоритмом удовлетворяет обеим леммам. Тогда можно воспользоваться одной из них чтобы улучшить оптимальное раписание. Следовательно {{---}} оптимальное расписание не оптимально. Противоречие. }} | |proof= Пусть это не так и оптимальное расписание отличается от расписания построенного алгоритмом. Заметим что расписание построенное алгоритмом удовлетворяет обеим леммам. Тогда можно воспользоваться одной из них чтобы улучшить оптимальное раписание. Следовательно {{---}} оптимальное расписание не оптимально. Противоречие. }} | ||
− | === Источники информации | + | == См. также == |
+ | * [[Pintreepi1Lmax|<tex>P \mid intree, p_{i} = 1 \mid L_{max}</tex>]] | ||
+ | * [[PpmtnriLmax|<tex>P \mid pmtn, r_i \mid L_{max}</tex>]] | ||
+ | * [[Ppi1sumwu|<tex>P \mid p_i=1 \mid \sum w_i U_i</tex>]] | ||
+ | == Источники информации == | ||
* P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 22 | * P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 22 | ||
− | [[Категория: | + | [[Категория: Алгоритмы и структуры данных]] |
[[Категория: Теория расписаний]] | [[Категория: Теория расписаний]] |
Текущая версия на 19:31, 4 сентября 2022
Задача: |
Дано Цель — составить такое расписание, чтобы суммарное время окончания всех работ было минимальным. | работ с заданными временами выполнения и параллельных станков с одинаковой скоростью выполнения работ.
Содержание
Описание алгоритма
Идея
Пусть
заданы в порядке невозрастания ( ). Пусть теперь . Тогда в оптимальном расписании работа с номером будет выполнена на станке с номером , -ой с конца.Псевдокод
Итоговым расписанием будет массив
где в храниться номер работы которую надо исполнить на станке номер , -ой по счёту.function getSchedule(p : int[n]): list<int>[m] Pair<int,int> jobs[n] for i = 0 to n jobs[i] =p[i], i // Создаём пары для востановления номера работы после сортировки. sort(jobs) // Cортируем массив в порядке уменьшения p[i].
list<int> schedule[m] // Заведём список работ для каждого станка. Ответ будет храниться в нём. for i = 0 to n schedule[i mod m].pushFront(jobs[i].second) // Cтавим i-ую в порядке уменьшения p[i] работу на станок i mod m в конец.
return schedule
Ассимптотика
Так как нам понадобится сортировка для массива , то итоговая ассимптотика будет .
Доказательство корректности
Докажем две леммы:
Лемма: |
В оптимальном расписании на каждом станке работы выполняются в порядке неубывания времён выполнения. |
Доказательство: |
Пусть это не так. Заметим что | . Следовательно каждая работа даёт вклад равный . Тогда поменяем местами две работы которые нарушают порядок невозрастания. Заметим что уменьшилась. Следовательно — оптимальное расписание не оптимально. Противоречие.
Лемма: |
В оптимальном расписании количество выполненных работ на любых двух станках отличается не более чем на . |
Доказательство: |
Пусть это не так. Как было отмечено в предыдущей лемме, каждая работа даёт вклад в | равный . Найдём два станка количество работ на которых отличается больше чем на . Пусть это станки и . Причём на стнаке выполняется больше работ. Тогда если отправить первую с начала работу со станка на станок то уменьшится на разность количества работ на станках и . Следовательно — оптимальное расписание не оптимально. Противоречие.
Теорема: |
Алгоритм строит оптимальное расписание. |
Доказательство: |
Пусть это не так и оптимальное расписание отличается от расписания построенного алгоритмом. Заметим что расписание построенное алгоритмом удовлетворяет обеим леммам. Тогда можно воспользоваться одной из них чтобы улучшить оптимальное раписание. Следовательно — оптимальное расписание не оптимально. Противоречие. |
См. также
Источники информации
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 22