Алгоритм отмены цикла минимального среднего веса — различия между версиями
|  (Новая страница: «==Алгоритм отмены цикла минимального среднего веса==  Приведенный алгоритм принадлежит к...») | Penguinni (обсуждение | вклад)  | ||
| Строка 1: | Строка 1: | ||
| − | ==Алгоритм отмены цикла минимального среднего веса | + | В статье описывается один из сильно полиномиальных алгоритмов решения [[Поток минимальной стоимости #Задача о потоке минимальной стоимости|задачи о поиске потока минимальной стоимости]]. | 
| − | + | ==Алгоритм== | |
| − | + | Приведенный алгоритм основан на идее [[Поток минимальной стоимости #Метод устранения отрицательных циклов в остаточной сети|алгоритма Клейна отмены цикла отрицательного веса]]. Выбор цикла минимального среднего веса вместо случайного делает алгоритм сильно полиномиальным. | |
| {{Определение | {{Определение | ||
| |definition='''Сильно полиномиальными''' в контексте данной задачи называются алгоритмы, чья сложность полиномиально зависит от <tex>V</tex> {{---}} числа вершин и <tex>E</tex> {{---}} числа ребер графа.}} | |definition='''Сильно полиномиальными''' в контексте данной задачи называются алгоритмы, чья сложность полиномиально зависит от <tex>V</tex> {{---}} числа вершин и <tex>E</tex> {{---}} числа ребер графа.}} | ||
| − | + | ===Описание=== | |
| − | ===Описание  | + | Обозначим как <tex>c_{f}(C)</tex> остаточную пропускную способность цикла <tex>C</tex> при протекании в сети потока <tex>f</tex>. | 
| − | + | Cтоимость цикла <tex>C</tex> обозначим за <tex>p(C)</tex>, а длину (число входящих в него ребер) {{---}} за <tex>\texttt{len}(C)</tex>. | |
| − | |||
| {{Определение | {{Определение | ||
| − | |definition='''Средним весом цикла'''  | + | |definition='''Средним весом цикла''' будем называть отношение его стоимости к его длине <tex>\mu (C)=\frac{p(C)}{\texttt{len}(C)}</tex>}} | 
| − | + | * '''Шаг1'''. Рассмотрим некоторый поток <tex>f</tex>.   | |
| − | + | * '''Шаг2'''. Найдем цикл <tex>C</tex>, обладающий наименьшим средним весом. Если <tex>\mu (C) \geq 0</tex>, то <tex>f</tex> {{---}} поток минимальной стоимости и алгоритм завершается. | |
| − | Рассмотрим некоторый поток <tex>f</tex>.  | + | * '''Шаг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\cdot VE^{2}\log{V})</tex>, при этом | ||
| <tex>O(VE)</tex> времени тратится на поиск цикла минимального среднего веса. | <tex>O(VE)</tex> времени тратится на поиск цикла минимального среднего веса. | ||
| − | + | ==Алгоритм поиска цикла минимального среднего веса== | |
| − | + | ===Наивный способ=== | |
| − | === | + | Устроим [[Вещественный двоичный поиск |двоичный поиск]]. | 
| − | Устроим двоичный поиск. | + | Установим нижнюю и верхнюю границы величины среднего веса цикла <tex>l</tex> и <tex>r</tex> соответственно, вычислим серединное значение <tex>m</tex> и отнимем полученную величину <tex>m</tex> от всех ребер сети. Если теперь в нашей сети есть отрицательный цикл, значит существует цикл с меньшим средним весом, чем <tex>m</tex>. Тогда сдвигаем правую границу на <tex>m</tex>, иначе {{---}} левую. | 
| − | |||
| Такой алгоритм будет работать за <tex>O(\texttt{log} \frac{1}{\varepsilon} \cdot EV)</tex>, где <tex>\varepsilon</tex> {{---}} точность выбора величины среднего веса цикла. | Такой алгоритм будет работать за <tex>O(\texttt{log} \frac{1}{\varepsilon} \cdot EV)</tex>, где <tex>\varepsilon</tex> {{---}} точность выбора величины среднего веса цикла. | ||
| − | + | ===способ убрать <tex>\texttt{log} \frac{1}{\varepsilon}</tex> из оценки=== | |
| Добавим к нашему графу вершину <tex>s</tex> и ребра из нее во все остальные вершины. | Добавим к нашему графу вершину <tex>s</tex> и ребра из нее во все остальные вершины. | ||
Версия 01:26, 26 декабря 2016
В статье описывается один из сильно полиномиальных алгоритмов решения задачи о поиске потока минимальной стоимости.
Содержание
Алгоритм
Приведенный алгоритм основан на идее алгоритма Клейна отмены цикла отрицательного веса. Выбор цикла минимального среднего веса вместо случайного делает алгоритм сильно полиномиальным.
| Определение: | 
| Сильно полиномиальными в контексте данной задачи называются алгоритмы, чья сложность полиномиально зависит от — числа вершин и — числа ребер графа. | 
Описание
Обозначим как остаточную пропускную способность цикла при протекании в сети потока . Cтоимость цикла обозначим за , а длину (число входящих в него ребер) — за .
| Определение: | 
| Средним весом цикла будем называть отношение его стоимости к его длине | 
- Шаг1. Рассмотрим некоторый поток .
- Шаг2. Найдем цикл , обладающий наименьшим средним весом. Если , то — поток минимальной стоимости и алгоритм завершается.
- Шаг3. Отменим цикл , пустив по нему максимально возможный поток: . Перейдем к шагу 1.
Сложность
, при этом времени тратится на поиск цикла минимального среднего веса.
Алгоритм поиска цикла минимального среднего веса
Наивный способ
Устроим двоичный поиск. Установим нижнюю и верхнюю границы величины среднего веса цикла и соответственно, вычислим серединное значение и отнимем полученную величину от всех ребер сети. Если теперь в нашей сети есть отрицательный цикл, значит существует цикл с меньшим средним весом, чем . Тогда сдвигаем правую границу на , иначе — левую. Такой алгоритм будет работать за , где — точность выбора величины среднего веса цикла.
способ убрать из оценки
Добавим к нашему графу вершину  и ребра из нее во все остальные вершины.
Рассмотрим алгоритм Форда-Беллмана и попросим его построить нам следущую квадратную матрицу:
d[i][u] // длина минимального пути от s до u ровно из i ребер
Тогда длина оптимального цикла минимального среднего веса вычисляется как .
Почему это так? Грубо говоря, достаточно доказать для , так как для других можно просто отнять его величину от всех ребер и получить рассматриваемый случай.
--- как же найти сам цикл Запомним, при каких и достигается этот минимум, и, используя , по указателям предков поднимаемся. Как только мы зациклимся — мы нашли цикл минимального среднего веса.
Этот алогоритм работает за .
