|
|
Строка 51: |
Строка 51: |
| Расписание, построенное данным алгоритмом, является корректным и оптимальным. | | Расписание, построенное данным алгоритмом, является корректным и оптимальным. |
| |proof= | | |proof= |
− | Доказательство будем вести от противного.<br/>
| + | Корректность алгоритма очевидна. |
− | Рассмотрим расписание <tex>S_{1}</tex>, полученное после выполнения нашего алгоритма, и оптимальное расписание <tex>S_{2}</tex>.<br/>
| + | Докажем оптимальность. |
− | Возьмём первый момент времени <tex>t_{1}</tex>, когда расписания различаются. Пусть в этот момент времени в <tex>S_{1}</tex>, будет выполняться работа с весом <tex>w_{1}</tex>, а в <tex>S_{2}</tex> {{---}} работа с весом <tex>w_{2}</tex>.<br/>
| + | Рассмотрим станок на котором достигается <tex>С_{max}</tex>. Если этот станок работает без прерываний, то оптимальность очевидна(<tex>C_{max} >= \sum Q</tex>) |
− | Это первый момент, в котором расписания отличаются, значит в <tex>S_{2}</tex> работа с весом <tex>w_{1}</tex> выполнится в момент времени <tex>t_{2} > t_{1}</tex>.<br/>
| + | |
− | Поменяем местами работы с весами <tex>w_{1}</tex> и <tex>w_{2}</tex> в <tex>S_{2}</tex> и полуим расписание <tex>S_{3}</tex>. Это возможно, потому что время появления этих работ не меньше <tex>t_{1}</tex>.<br/>
| |
− | При такой перестановке ответы на задачу для <tex>S_{2}</tex> и <tex>S_{3}</tex> будут отличаться на
| |
− | <ul><tex>t_{1}w_{2} + t_{2}w_{1} - t_{1}w_{1} + t_{2}w_{2} = t_{1}(w_{2} - w_{1}) + t_{2}(w_{1} - w_{2}) = (t_{1} - t_{2})(w_{2} - w_{1})</tex></ul>
| |
− | Первая скобка отрицательная: <tex>t_{1} < t_{2}</tex>. Вторая скобка тоже отрицательная из того, что в <tex>S_{1}</tex> работа с весом <tex>w_1</tex> выполняется раньше, значит её вес должен быть больше <tex>w_2</tex>.<br/>
| |
− | Итого имеем, что ответ для <tex>S_{2}</tex> больше, чем ответ для <tex>S_{3}</tex>. Следовательно расписание <tex>S_2</tex> неоптимальное. Получили противоречие. Значит не существует такого момента времени, когда расписание <tex>S_{1}</tex> отличается от оптимального. Следовательно мы доказали, что оно оптимальное.
| |
| }} | | }} |
| | | |
Версия 16:10, 22 июня 2013
Постановка задачи
Рассмотрим задачу:
- Дано [math]n[/math] работ и [math]2[/math] станка.
- Для каждой работы известно её время выполнения на каждом станке.
- Для каждой работы известна последовательность станков - порядок, в котором нужно выполнить работу. [math]1[/math].
- Длина любой последовательности [math]\lt =2[/math].
Требуется минимизировать время окончания выполнения всех работ.
Описание алгоритма
[math]M_{1}[/math] - первый станок. [math]M_{2}[/math] - второй станок.
Разобьем все работы на четыре множества:
- [math]I_{1}[/math] - множество всех работ, которые должны выполнится только на [math]M_{1}[/math].
- [math]I_{2}[/math] - множество всех работ, которые должны выполнится только на [math]M_{2}[/math].
- [math]I_{12}[/math] - множество всех работ, которые должны выполнится сначала на [math]M_{1}[/math] затем на [math]M_{2}[/math].
- [math]I_{21}[/math] - множество всех работ, которые должны выполнится сначала на [math]M_{2}[/math] затем на [math]M_{1}[/math].
Решим задачу [math]F2 \mid \mid C_{max}[/math] для [math]I_{12}[/math] и для [math]I_{21}[/math]. Получим расписание [math]S_{12}[/math] и [math]S_{21}[/math].
Тогда оптимальное расписание для нашей задачи будет следующим:
- Расписание [math]M1[/math] : сначала [math]I_{12}[/math] в соответсвии с расписанием [math]S_{12}[/math]. Затем [math]I_{1}[/math] в произвольном порядке. Затем [math]I_{21}[/math] в соответсвии с [math]S_{21}[/math].
- Расписание [math]M_{2}[/math] : сначала [math]I_{21}[/math] в соответсвии с расписанием [math]S_{21}[/math]. Затем [math]I_{2}[/math] в произвольном порядке. Затем [math]I_{12}[/math] в соответсвии с [math]S_{12}[/math].
Примечание: во время выполнения [math]I_{21}[/math] на [math]M_{1}[/math] или [math]I_{12}[/math] на [math]M_{2}[/math] могут возникнуть простои
из-за того, что работа ещё не выполнилась на предыдущем станке.
Доказательство корректности алгоритма
[math]T_{i}(x)[/math] - время выполнения множества работ [math]x[/math] на станке [math]i[/math].
Лемма: |
Расписание, построенное данным алгоритмом, обладает следующим свойством : один из станков работает без простоев. |
Доказательство: |
[math]\triangleright[/math] |
Рассмотрим 2 варианта:
[math]T_{1}(I_{12}) + T_{1}(I_{1}) \gt = T_{2}(I_{21}) [/math].
Тогда [math]M_{1}[/math] работает без прерываний, т.к к тому моменту завершения выполнения [math]I_{1}[/math] на [math] M_{1} [/math] все работы [math]I_{21}[/math] выполнены на [math]M_{2}[/math].
Иначе [math]T_{1}(I_{12}) + T_{1}(I_{1}) \lt T_{2}(I_{21}) [/math].
Тогда [math]M_{2}[/math] работает без прерываний, т.к к тому моменту завершения выполнения [math]I_{2}[/math] на [math] M_{2} [/math] все работы [math]I_{12}[/math] выполнены на [math]M_{1}[/math]. |
[math]\triangleleft[/math] |
Теорема: |
Расписание, построенное данным алгоритмом, является корректным и оптимальным. |
Доказательство: |
[math]\triangleright[/math] |
Корректность алгоритма очевидна.
Докажем оптимальность.
Рассмотрим станок на котором достигается [math]С_{max}[/math]. Если этот станок работает без прерываний, то оптимальность очевидна([math]C_{max} \gt = \sum Q[/math]) |
[math]\triangleleft[/math] |
Псевдокод
[math] S \leftarrow \{1 \dots n\}[/math]
[math] time \leftarrow 0[/math]
[math] answer \leftarrow 0[/math]
while [math] S \neq \varnothing [/math]
[math] j \leftarrow i : (\max \limits_{i \in S, r_{i} \leq time} w_{i})[/math]
if [math]j \neq null [/math]
[math] S \leftarrow S \setminus j[/math]
[math] Answer \leftarrow Answer + time \cdot w_{j}[/math]
[math] time++[/math]
Сложность алгоритма
Время работы алгоритма равно времени работы алгоритма [math]F2 \mid \mid C_{max}[/math].
Сложность алгоритма [math]O(n\log n)[/math].