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

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 4: Строка 4:
 
}}
 
}}
  
== Идея ==
+
== Описание алгоритма ==
 +
=== Идея ===
 
Пусть <tex>p_{i}</tex> заданы в порядке невозрастания (<tex>p_{1}  \geqslant p_{2} \geqslant \ldots \geqslant p_{n} </tex>). Пусть теперь <tex>b_{k} = \dfrac{k}{m}</tex>. Тогда в оптимальном расписании работа с номером <tex>i</tex> будет выполнена на станке <tex>i \bmod m</tex>, <tex>b_{i}</tex>-ой с конца.
 
Пусть <tex>p_{i}</tex> заданы в порядке невозрастания (<tex>p_{1}  \geqslant p_{2} \geqslant \ldots \geqslant p_{n} </tex>). Пусть теперь <tex>b_{k} = \dfrac{k}{m}</tex>. Тогда в оптимальном расписании работа с номером <tex>i</tex> будет выполнена на станке <tex>i \bmod m</tex>, <tex>b_{i}</tex>-ой с конца.
 +
 +
=== Псевдокод ===
 +
 +
list<int> schedule[m] <font color=green> //Заведём список работ для каждого станка. Ответ будет храниться в нём.</font>
 +
    '''for''' i = 0 '''to''' n
 +
        schedule[i mod m].push(i) <font color=green>//ставим работу с номером i на станок i mod m в конец.</font><br>
 +
    <font color=green>//Заметим что расписание для каждого станка получилось перевёрнутым<br>    //Поэтому развернём расписание для каждого станка.</font>
 +
    '''for''' i = 0 '''to''' m
 +
        schedule[i].reverse()

Версия 19:16, 4 июня 2016

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

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


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

Идея

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

Псевдокод

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()