Поток минимальной стоимости — различия между версиями
 (→Свойства стоимости)  | 
				 (→Алгоритм)  | 
				||
| (не показано 36 промежуточных версий 6 участников) | |||
| Строка 2: | Строка 2: | ||
{{Определение  | {{Определение  | ||
| − | |definition=  | + | |definition=Пусть дана сеть <tex>G(V,E)</tex>. <tex>S, T \in V</tex> {{---}} источник и сток. Ребра <tex>(u,v) \in E</tex> имееют пропускную способность <tex> c(u, v), </tex> поток <tex> f(u,v) </tex> и цену за единицу потока <tex>a(u, v) </tex>. Тогда '''общая стоимость потока''' из <tex>S</tex> в <tex>T</tex>:  | 
| − | :<tex>p(u,v) = \  | + | :<tex>p(u,v) = \sum\limits_{u,v \in V, f(u,v)>0} a(u,v) \cdot f(u,v)</tex>  | 
}}  | }}  | ||
| − | ===Свойства   | + | ===Свойства сети===  | 
* Поток не может превысить пропускную способность.    | * Поток не может превысить пропускную способность.    | ||
| − | :<tex>f(u,v) \  | + | :<tex>f(u,v) \leqslant c(u,v)</tex>  | 
* Поток из <tex>u</tex> в <tex>v</tex> должен быть противоположным потоку из <tex>v</tex> в <tex>u</tex>.    | * Поток из <tex>u</tex> в <tex>v</tex> должен быть противоположным потоку из <tex>v</tex> в <tex>u</tex>.    | ||
:<tex>f(u, v)=-f(v, u)</tex>  | :<tex>f(u, v)=-f(v, u)</tex>  | ||
| − | * Сохранение потока. Для каждой вершины, сумма входящего и исходящего потоков равно 0.  | + | * Сохранение потока. Для каждой вершины, сумма входящего и исходящего потоков равно <tex>0</tex>.  | 
:<tex> \sum\limits_{w \in V} f(u,w) = 0</tex>  | :<tex> \sum\limits_{w \in V} f(u,w) = 0</tex>  | ||
| − | |||
{{Задача  | {{Задача  | ||
| − | |definition = Дана сеть <tex>G(V,E)</tex>. <tex>S, T \in V</tex> {{---}} источник и сток. <tex>  | + | |definition = Дана сеть <tex>G(V,E)</tex>. <tex>S, T \in V</tex> {{---}} источник и сток. Ребра <tex>(u,v) \in E</tex> имееют пропускную способность <tex> c(u, v), </tex> поток <tex> f(u,v) </tex> {{---}}  | 
| + | и цену за единицу потока <tex> a(u, v) </tex>. Требуется найти максимальный поток, суммарная стоимость которого минимальна.  | ||
}}  | }}  | ||
| + | == Алгоритмы решения ==  | ||
| + | ===Метод устранения отрицательных циклов в остаточной сети===  | ||
| + | Воспользуемся [[Лемма об эквивалентности свойства потока быть минимальной стоимости и отсутствии отрицательных циклов в остаточной сети|леммой об эквивалентности свойства потока быть минимальной стоимости и отсутствии отрицательных циклов в остаточной сети]]. Получим следующий алгоритм:  | ||
| + | ====Алгоритм====  | ||
| + | * '''Начало.'''  | ||
| + | * '''Шаг 1'''. Определим для каждого прямого ребра <tex>(u,v)</tex> обратное ребро <tex>(v,u)</tex>. Определим его характеристики: <tex>c(v,u)=0</tex>, <tex>f(v,u)=-f(u,v)</tex>, <tex>a(v,u)=-a(u,v)</tex>.  | ||
| + | * '''Шаг 2'''. Для каждого ребра зададим поток равный <tex>0</tex>.  | ||
| + | * '''Шаг 3'''. Найдем произвольный максимальный поток(любым алгоритмом нахождения максимального потока), построим для него остаточную сеть, где каждому ребру будет соответствовать величина <tex>a(u,v) \cdot (c(u,v) - f(u,v))</tex>.  | ||
| + | * '''Шаг 4'''. При помощи [[Алгоритм Форда-Беллмана| алгоритма Форда-Беллмана]] найдем отрицательный цикл в построенной сети (отрицательный цикл ищется по стоимости ребра, т.е. ребра имеют вес <tex>a(u,v)</tex>). Если отрицательный цикл не нашелся {{---}} перейдем к '''шагу 6'''.  | ||
| + | * '''Шаг 5'''. Избавимся от отрицательного цикла, для этого пустим по нему максимально возможный поток. Величина потока равна минимальной остаточной пропускной способности в цикле. Перейдем к '''шагу 4'''.  | ||
| + | * '''Шаг 6'''. Отрицательных циклов в остаточной сети нет, значит, максимальный поток минимальной стоимости найден.  | ||
| + | * '''Конец.'''  | ||
| − | ===   | + | ====Асимптотика====  | 
| − | + | Алгоритм Форда-Беллмана работает за <tex>O(VE)</tex>, улучшение цикла за <tex>O(E)</tex>. Если обозначить максимальную стоимость потока как <tex>C</tex>, а максимальную пропускную способность как <tex>U</tex>, то алгоритм совершит <tex>O(ECU)</tex> итераций поиска цикла, если каждое улучшение цикла будет улучшать его на 1. В итоге имеем <tex>O(V E^2 C U + maxFlow)</tex>, где <tex>maxFlow</tex> - асимптотика поиска максимального потока.  | |
| − | |||
| − | |||
| − | |||
| − | + | ===Метод дополнения потока вдоль путей минимальной стоимости===  | |
| − | + | {{main|Поиск потока минимальной стоимости методом дополнения вдоль путей минимальной стоимости}}  | |
| + | |||
| + | ===Использование потенциалов Джонсона===  | ||
| + | {{main|Использование потенциалов Джонсона при поиске потока минимальной стоимости}}  | ||
== См. также ==  | == См. также ==  | ||
| − | * [[  | + | * [[Сведение задачи о назначениях к задаче о потоке минимальной стоимости|Сведение задачи о назначениях к задаче о потоке минимальной стоимости]]  | 
| − | + | * [[Венгерский алгоритм решения задачи о назначениях|Венгерский алгоритм решения задачи о назначениях]]  | |
| − | * [[  | ||
== Источники информации ==  | == Источники информации ==  | ||
| − | *[http://ru.wikipedia.org/wiki/Поток_минимальной_стоимости Википедия - Поток минимальной стоимости]  | + | *[http://ru.wikipedia.org/wiki/Поток_минимальной_стоимости Википедия {{---}} Поток минимальной стоимости]  | 
*[http://rain.ifmo.ru/cat/view.php/vis/graph-flow-match/min-cost-max-flow-2009 Визуализатор алгоритма нахождения максимального потока минимальной стоимости]  | *[http://rain.ifmo.ru/cat/view.php/vis/graph-flow-match/min-cost-max-flow-2009 Визуализатор алгоритма нахождения максимального потока минимальной стоимости]  | ||
| − | *[http://habrahabr.ru/blogs/algorithm/61884/ Хабрахабр - Максимальный поток минимальной стоимости]  | + | *[http://habrahabr.ru/blogs/algorithm/61884/ Хабрахабр {{---}} Максимальный поток минимальной стоимости]  | 
| − | + | * ''Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд'' '''Алгоритмы: построение и анализ''', 2-е издание. Пер. с англ. {{---}} М.:Издательский дом "Вильямс", 2010. {{---}} 1296 с.: ил. {{---}} Парал. тит. англ. {{---}} ISBN 978-5-8459-0857-5 (рус.)  | |
| − | |||
| − | * ''Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд'' '''Алгоритмы: построение и анализ''', 2-е издание. Пер. с англ.   | ||
[[Категория:Алгоритмы и структуры данных]]  | [[Категория:Алгоритмы и структуры данных]]  | ||
[[Категория: Задача о потоке минимальной стоимости]]  | [[Категория: Задача о потоке минимальной стоимости]]  | ||
Версия 22:48, 2 мая 2020
Содержание
Задача о потоке минимальной стоимости
| Определение: | 
| Пусть дана сеть .  — источник и сток. Ребра  имееют пропускную способность  поток  и цену за единицу потока . Тогда общая стоимость потока из  в :
 | 
Свойства сети
- Поток не может превысить пропускную способность.
 
- Поток из в должен быть противоположным потоку из в .
 
- Сохранение потока. Для каждой вершины, сумма входящего и исходящего потоков равно .
 
| Задача: | 
| Дана сеть . — источник и сток. Ребра имееют пропускную способность поток — и цену за единицу потока . Требуется найти максимальный поток, суммарная стоимость которого минимальна. | 
Алгоритмы решения
Метод устранения отрицательных циклов в остаточной сети
Воспользуемся леммой об эквивалентности свойства потока быть минимальной стоимости и отсутствии отрицательных циклов в остаточной сети. Получим следующий алгоритм:
Алгоритм
- Начало.
 - Шаг 1. Определим для каждого прямого ребра обратное ребро . Определим его характеристики: , , .
 - Шаг 2. Для каждого ребра зададим поток равный .
 - Шаг 3. Найдем произвольный максимальный поток(любым алгоритмом нахождения максимального потока), построим для него остаточную сеть, где каждому ребру будет соответствовать величина .
 - Шаг 4. При помощи алгоритма Форда-Беллмана найдем отрицательный цикл в построенной сети (отрицательный цикл ищется по стоимости ребра, т.е. ребра имеют вес ). Если отрицательный цикл не нашелся — перейдем к шагу 6.
 - Шаг 5. Избавимся от отрицательного цикла, для этого пустим по нему максимально возможный поток. Величина потока равна минимальной остаточной пропускной способности в цикле. Перейдем к шагу 4.
 - Шаг 6. Отрицательных циклов в остаточной сети нет, значит, максимальный поток минимальной стоимости найден.
 - Конец.
 
Асимптотика
Алгоритм Форда-Беллмана работает за , улучшение цикла за . Если обозначить максимальную стоимость потока как , а максимальную пропускную способность как , то алгоритм совершит итераций поиска цикла, если каждое улучшение цикла будет улучшать его на 1. В итоге имеем , где - асимптотика поиска максимального потока.
Метод дополнения потока вдоль путей минимальной стоимости
Использование потенциалов Джонсона
См. также
- Сведение задачи о назначениях к задаче о потоке минимальной стоимости
 - Венгерский алгоритм решения задачи о назначениях
 
Источники информации
- Википедия — Поток минимальной стоимости
 - Визуализатор алгоритма нахождения максимального потока минимальной стоимости
 - Хабрахабр — Максимальный поток минимальной стоимости
 - Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)