PSumCi
| НЕТ ВОЙНЕ |
|
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. Антивоенный комитет России |
| Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. |
| meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки. |
| Задача: |
| Дано работ с заданными временами выполнения и параллельных станков с одинаковой скоростью выполнения работ. Цель — составить такое расписание, чтобы суммарное время окончания всех работ было минимальным. |
Содержание
Описание алгоритма
Идея
Пусть заданы в порядке невозрастания (). Пусть теперь . Тогда в оптимальном расписании работа с номером будет выполнена на станке с номером , -ой с конца.
Псевдокод
Итоговым расписанием будет массив где в храниться номер работы которую надо исполнить на станке номер , -ой по счёту.
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