PSumCi — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Псевдокод)
Строка 1: Строка 1:
 +
{| class="wikitable" align="center" style="color: red; background-color: black; font-size: 56px; width: 800px;"
 +
|+
 +
|-align="center"
 +
|'''НЕТ ВОЙНЕ'''
 +
|-style="font-size: 16px;"
 +
|
 +
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.
 +
 +
Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием.
 +
 +
Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей.
 +
 +
Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить.
 +
 +
''Антивоенный комитет России''
 +
|-style="font-size: 16px;"
 +
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.
 +
|-style="font-size: 16px;"
 +
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].
 +
|}
 +
 
<tex dpi = "200">P \mid \mid \sum C_{i}</tex>
 
<tex dpi = "200">P \mid \mid \sum C_{i}</tex>
 
{{Задача
 
{{Задача

Версия 07:25, 1 сентября 2022

НЕТ ВОЙНЕ

24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.

Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием.

Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей.

Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить.

Антивоенный комитет России

Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.
meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки.

[math]P \mid \mid \sum C_{i}[/math]

Задача:
Дано [math]n[/math] работ с заданными временами выполнения [math]p_{i}[/math] и [math]m[/math] параллельных станков с одинаковой скоростью выполнения работ.
Цель — составить такое расписание, чтобы суммарное время окончания всех работ было минимальным.


Описание алгоритма

Идея

Пусть [math]p_{i}[/math] заданы в порядке невозрастания ([math]p_{0} \geqslant p_{1} \geqslant \ldots \geqslant p_{n-1} [/math]). Пусть теперь [math]b_{i} = \left\lceil\dfrac{i}{m}\right\rceil[/math]. Тогда в оптимальном расписании работа с номером [math]i[/math] будет выполнена на станке с номером [math]i \bmod m[/math], [math]b_{i}[/math]-ой с конца.

Псевдокод

Итоговым расписанием будет массив [math]\mathtt{schedule}[/math] где в [math]\mathtt{schedule[i][j]}[/math] храниться номер работы которую надо исполнить на станке номер [math]i[/math], [math]j[/math]-ой по счёту.

function getSchedule(p : int[n]): list<int>[m]
  Pair<int,int> jobs[n]
  for i = 0 to n
    jobs[i] = [math]\langle[/math]p[i], i[math]\rangle[/math] // Создаём пары для востановления номера работы после сортировки.
  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

Ассимптотика

Так как нам понадобится сортировка для массива [math]p_{i}[/math], то итоговая ассимптотика будет [math]\mathcal{O}(n\log{n})[/math].

Доказательство корректности

Докажем две леммы:

Лемма:
В оптимальном расписании на каждом станке работы выполняются в порядке неубывания времён выполнения.
Доказательство:
[math]\triangleright[/math]
Пусть это не так. Заметим что [math]\sum\limits_{i=0}^{n-1} C_{i} = \sum\limits_{i=0}^{n-1} p_{i} \cdot b_{i}[/math]. Следовательно каждая работа даёт вклад равный [math]p_{i} \cdot b_{i}[/math]. Тогда поменяем местами две работы которые нарушают порядок невозрастания. Заметим что [math]\sum\limits_{i=0}^{n-1} C_{i}[/math] уменьшилась. Следовательно — оптимальное расписание не оптимально. Противоречие.
[math]\triangleleft[/math]
Лемма:
В оптимальном расписании количество выполненных работ на любых двух станках отличается не более чем на [math]1[/math].
Доказательство:
[math]\triangleright[/math]
Пусть это не так. Как было отмечено в предыдущей лемме, каждая работа даёт вклад в [math]\sum\limits_{i=0}^{n-1} C_{i}[/math] равный [math]p_{i} \cdot b_{i}[/math]. Найдём два станка количество работ на которых отличается больше чем на [math]1[/math]. Пусть это станки [math]x[/math] и [math]y[/math]. Причём на стнаке [math]x[/math] выполняется больше работ. Тогда если отправить первую с начала работу со станка [math]x[/math] на станок [math]y[/math] то [math]\sum\limits_{i=0}^{n-1} C_{i}[/math] уменьшится на разность количества работ на станках [math]x[/math] и [math]y[/math]. Следовательно — оптимальное расписание не оптимально. Противоречие.
[math]\triangleleft[/math]
Теорема:
Алгоритм [math]P \mid \mid \sum C_{i}[/math] строит оптимальное расписание.
Доказательство:
[math]\triangleright[/math]
Пусть это не так и оптимальное расписание отличается от расписания построенного алгоритмом. Заметим что расписание построенное алгоритмом удовлетворяет обеим леммам. Тогда можно воспользоваться одной из них чтобы улучшить оптимальное раписание. Следовательно — оптимальное расписание не оптимально. Противоречие.
[math]\triangleleft[/math]

См. также

Источники информации

  • P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 22