Алгоритм отмены цикла минимального среднего веса — различия между версиями
Penguinni (обсуждение | вклад) (→Сложность) |
Penguinni (обсуждение | вклад) (→Алгоритм) |
||
Строка 12: | Строка 12: | ||
* '''Шаг 2'''. Найдем цикл <tex>C</tex>, обладающий наименьшим средним весом. Если <tex>\mu (C) \geqslant 0</tex>, то <tex>f</tex> {{---}} поток минимальной стоимости и алгоритм завершается. | * '''Шаг 2'''. Найдем цикл <tex>C</tex>, обладающий наименьшим средним весом. Если <tex>\mu (C) \geqslant 0</tex>, то <tex>f</tex> {{---}} поток минимальной стоимости и алгоритм завершается. | ||
* '''Шаг 3'''. Отменим цикл <tex>C</tex>, пустив по нему максимально возможный поток: <tex>f = f + c_{f}(C)\cdot f_{C}</tex>. Перейдем к '''шагу 1'''. | * '''Шаг 3'''. Отменим цикл <tex>C</tex>, пустив по нему максимально возможный поток: <tex>f = f + c_{f}(C)\cdot f_{C}</tex>. Перейдем к '''шагу 1'''. | ||
+ | |||
+ | ===Сложность=== | ||
+ | <tex>O(VE\cdot VE^{2}\log{V})</tex>, при этом | ||
+ | <tex>O(VE)</tex> времени тратится на поиск цикла минимального среднего веса. | ||
===Корректность=== | ===Корректность=== | ||
Строка 20: | Строка 24: | ||
{{Лемма | {{Лемма | ||
+ | |id=lemma1 | ||
|statement=Если <tex>f</tex> {{---}} поток минимальной стоимости, то <tex>\exists \varphi</tex> такое, что <tex>\forall uv: \; c_{f}(uv) > 0 \qquad p_{\varphi}(uv) \geqslant 0</tex>. | |statement=Если <tex>f</tex> {{---}} поток минимальной стоимости, то <tex>\exists \varphi</tex> такое, что <tex>\forall uv: \; c_{f}(uv) > 0 \qquad p_{\varphi}(uv) \geqslant 0</tex>. | ||
|proof= | |proof= | ||
Строка 31: | Строка 36: | ||
{{Лемма | {{Лемма | ||
+ | |id=lemma2 | ||
|statement=Если стоимости целочисленны и поток <tex>f</tex> {{---}} <tex>\varepsilon</tex>-оптимальный, где <tex>\varepsilon < \dfrac{1}{n}</tex>, то <tex>f</tex> {{---}} поток минимальной стоимости. | |statement=Если стоимости целочисленны и поток <tex>f</tex> {{---}} <tex>\varepsilon</tex>-оптимальный, где <tex>\varepsilon < \dfrac{1}{n}</tex>, то <tex>f</tex> {{---}} поток минимальной стоимости. | ||
|proof= | |proof= | ||
Строка 39: | Строка 45: | ||
Обозначим за <tex>\mu(f)</tex> минимальную величину среди средних весов циклов для потока <tex>f</tex>, а за <tex>\varepsilon(f)</tex> минимальное <tex>\varepsilon</tex> такое, что поток <tex>f</tex> {{---}} <tex>\varepsilon</tex>-оптимальный. | Обозначим за <tex>\mu(f)</tex> минимальную величину среди средних весов циклов для потока <tex>f</tex>, а за <tex>\varepsilon(f)</tex> минимальное <tex>\varepsilon</tex> такое, что поток <tex>f</tex> {{---}} <tex>\varepsilon</tex>-оптимальный. | ||
{{Лемма | {{Лемма | ||
+ | |id=lemma3 | ||
|statement=Если <tex>f</tex> {{---}} поток не минимальной стоимости, то <tex>\varepsilon(f)=-\mu(f)</tex>. | |statement=Если <tex>f</tex> {{---}} поток не минимальной стоимости, то <tex>\varepsilon(f)=-\mu(f)</tex>. | ||
|proof= | |proof= | ||
Строка 52: | Строка 59: | ||
{{Лемма | {{Лемма | ||
+ | |id=lemma4 | ||
|statement=Отмена цикла минимального среднего веса не увеличивает <tex>\varepsilon(f)</tex>. | |statement=Отмена цикла минимального среднего веса не увеличивает <tex>\varepsilon(f)</tex>. | ||
|proof= | |proof= | ||
Строка 59: | Строка 67: | ||
}} | }} | ||
− | + | {{Лемма | |
− | + | |about=доказательство оценки времени работы алгоритма | |
− | + | |statement=Пусть <tex>k=VE(\lceil \log V + 1 \rceil)</tex>. Разобьем работу алгоритма на группы по <tex>k</tex> последовательных итераций. Утверждается, что каждая группа фиксирует поток на независимом ребре <tex>uv</tex>, то есть итерации из другой группы не меняют величину <tex>f(uv)</tex>. | |
− | + | |proof= | |
− | = | + | Оценка следует непосредственно из этого утверждения. Чтобы доказать его, рассмотрим некоторую группу итераций. Пусть <tex>f</tex> {{---}} поток до первой итерации рассматриваемой группы, а <tex>f'</tex> {{---}} поток после последней итерации. Также пусть для простоты обозначений <tex>\varepsilon = \varepsilon(f)</tex>, <tex>\varepsilon'=\varepsilon(f')</tex>, при этом <tex>\varphi'</tex> {{---}} функция потенциалов такая, что <tex>f'</tex> удовлетворяет свойству <tex>\varepsilon'</tex>-оптимальности. Рассмотрим цикл <tex>C</tex>, отмененный после первой итерации группы. Выбор <tex>k</tex> дает нам <tex>\varepsilon' \leqslant \varepsilon \left(1-\dfrac{1}{V} \right)^{V(\log V + 1)} \leqslant \dfrac{\varepsilon}{2V}</tex>. Поскольку средний вес цикла <tex>C</tex> равен <tex>-\varepsilon</tex>, некоторое ребро <tex>uv</tex> цикла <tex>C</tex> должно иметь приведенную стоимость <tex>p_{\varphi'}(uv) \leqslant -\varepsilon \leqslant -2n\varepsilon'</tex>. Таким образом, поток на ребре <tex>uv</tex> не изменится при итерациях, происходящих после этой группы. Таким образом, каждая группа фиксирует поток на независимом ребре.}} |
− | Пусть <tex>k=VE(\lceil \log V + 1 \rceil)</tex>. Разобьем работу алгоритма на группы по <tex>k</tex> последовательных итераций. Утверждается, что каждая группа фиксирует поток на независимом ребре <tex>uv</tex>, то есть итерации из другой группы не меняют величину <tex>f(uv)</tex>. | ||
− | |||
− | Оценка следует непосредственно из этого утверждения. Чтобы доказать его, рассмотрим некоторую группу итераций. Пусть <tex>f</tex> {{---}} поток до первой итерации рассматриваемой группы, а <tex>f'</tex> {{---}} поток после последней итерации. Также пусть для простоты обозначений <tex>\varepsilon = \varepsilon(f)</tex>, <tex>\varepsilon'=\varepsilon(f')</tex>, при этом <tex>\varphi'</tex> {{---}} функция потенциалов такая, что <tex>f'</tex> удовлетворяет свойству <tex>\varepsilon'</tex>-оптимальности. Рассмотрим цикл <tex>C</tex>, отмененный после первой итерации группы. Выбор <tex>k</tex> дает нам <tex>\varepsilon' \leqslant \varepsilon \left(1-\dfrac{1}{V} \right)^{V(\log V + 1)} \leqslant \dfrac{\varepsilon}{2V}</tex>. Поскольку средний вес цикла <tex>C</tex> равен <tex>-\varepsilon</tex>, некоторое ребро <tex>uv</tex> цикла <tex>C</tex> должно иметь приведенную стоимость <tex>p_{\varphi'}(uv) \leqslant -\varepsilon \leqslant -2n\varepsilon'</tex>. Таким образом, поток на ребре <tex>uv</tex> не изменится при итерациях, происходящих после этой группы. Таким образом, каждая группа фиксирует поток на независимом ребре. | ||
==Алгоритм поиска цикла минимального среднего веса== | ==Алгоритм поиска цикла минимального среднего веса== |
Версия 13:48, 5 января 2017
В статье описывается один из сильно полиномиальных алгоритмов решения задачи о поиске потока минимальной стоимости.
Содержание
Алгоритм
Приведенный алгоритм основан на идее алгоритма Клейна отмены цикла отрицательного веса. Выбор цикла минимального среднего веса вместо случайного делает алгоритм сильно полиномиальным.
Определение: |
Сильно полиномиальными (англ. strongly polynomial) в контексте данной задачи называются алгоритмы, чья сложность полиномиально зависит от | и .
Описание
Обозначим как пропускную способность цикла при протекании в сети потока . Cтоимость цикла обозначим за , а длину (число входящих в него ребер) — за .
остаточнуюОпределение: |
Средним весом (англ. mean weight) цикла будем называть отношение его стоимости к его длине |
- Шаг 1. Рассмотрим некоторый поток .
- Шаг 2. Найдем цикл , обладающий наименьшим средним весом. Если , то — поток минимальной стоимости и алгоритм завершается.
- Шаг 3. Отменим цикл , пустив по нему максимально возможный поток: . Перейдем к шагу 1.
Сложность
, при этом времени тратится на поиск цикла минимального среднего веса.
Корректность
Пусть потенциалов .
— поток минимальной стоимости. Введем на нашей сети функциюОпределение: |
Приведенной стоимостью (англ. reduced cost) ребра назовем следующую величину: | .
Иными словами, приведенная стоимость — это сколько нужно потратить денег, чтобы перевести единицу жидкости из
в . (Ее нужно купить в , перевезти из в и продать в .)Лемма: |
Если — поток минимальной стоимости, то такое, что . |
Доказательство: |
|
Определение: |
Будем говорить, что поток | — -оптимальный (англ. -optimal), если такая, что .
Лемма: |
Если стоимости целочисленны и поток — -оптимальный, где , то — поток минимальной стоимости. |
Доказательство: |
|
Обозначим за
минимальную величину среди средних весов циклов для потока , а за минимальное такое, что поток — -оптимальный.Лемма: |
Если — поток не минимальной стоимости, то . |
Доказательство: |
|
Лемма: |
Отмена цикла минимального среднего веса не увеличивает . |
Доказательство: |
|
Лемма (доказательство оценки времени работы алгоритма): |
Пусть . Разобьем работу алгоритма на группы по последовательных итераций. Утверждается, что каждая группа фиксирует поток на независимом ребре , то есть итерации из другой группы не меняют величину . |
Доказательство: |
Оценка следует непосредственно из этого утверждения. Чтобы доказать его, рассмотрим некоторую группу итераций. Пусть | — поток до первой итерации рассматриваемой группы, а — поток после последней итерации. Также пусть для простоты обозначений , , при этом — функция потенциалов такая, что удовлетворяет свойству -оптимальности. Рассмотрим цикл , отмененный после первой итерации группы. Выбор дает нам . Поскольку средний вес цикла равен , некоторое ребро цикла должно иметь приведенную стоимость . Таким образом, поток на ребре не изменится при итерациях, происходящих после этой группы. Таким образом, каждая группа фиксирует поток на независимом ребре.
Алгоритм поиска цикла минимального среднего веса
Наивный способ
Устроим двоичный поиск. Установим нижнюю и верхнюю границы величины среднего веса цикла и соответственно, вычислим серединное значение и отнимем полученную величину от всех ребер сети. Если теперь в нашей сети есть отрицательный цикл (этот факт можно проверить при помощи алгоритма Форда-Беллмана), значит существует цикл с меньшим средним весом, чем . Тогда продолжим поиск среди значений в диапазоне от до , иначе — от до . Такой алгоритм будет работать за , где — точность выбора величины среднего веса цикла.
Продвинутый алгоритм
Добавим к нашему графу вершину алгоритм Форда-Беллмана и попросим его построить нам квадратную матрицу со следующим условием: — длина минимального пути от до ровно из ребер. Тогда длина оптимального цикла минимального среднего веса вычисляется как .
и ребра из нее во все остальные вершины. ЗапустимДостаточно будет доказать это правило для
, так как для других можно просто отнять эту величину от всех ребер и получить снова случай с .Чтобы найти цикл после построения матрицы
, запомним, при каких и достигается оптимальное значение , и, используя , поднимемся по указателям предков. Как только мы попадем в уже посещенную вершину — мы нашли цикл минимального среднего веса.Этот алогоритм работает за
.См. также
- Использование потенциалов Джонсона при поиске потока минимальной стоимости
- Сведение задачи о назначениях к задаче о потоке минимальной стоимости