Поток минимальной стоимости — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (rollbackEdits.php mass rollback)
 
(не показаны 63 промежуточные версии 12 участников)
Строка 1: Строка 1:
== Определение задачи ==
+
==Задача о потоке минимальной стоимости==
Задача о потоке минимальной стоимости состоит в нахождении самого дешёвого способа передачи определённого количества [[Определение сети, потока|потока]] через заданную [[Определение сети, потока|сеть]].
+
 
 
{{Определение
 
{{Определение
|definition=Дано число <tex>f_0</tex> и транспортная сеть <tex>\,G(V,E)</tex> с источником <tex>s \in V</tex> и стоком <tex>t \in V</tex>, где ребра <tex>(u,v) \in E</tex> имеют пропускную способность <tex>\,c(u,v)</tex> и цену <tex>\,p(u,v)</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>. Тогда '''общая стоимость потока''' из <tex>S</tex> в <tex>T</tex>:
 +
:<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) \leqslant c(u,v)</tex>
 +
* Поток из <tex>u</tex> в <tex>v</tex> должен быть противоположным потоку из <tex>v</tex> в <tex>u</tex>.
 +
:<tex>f(u, v)=-f(v, u)</tex>
 +
* Сохранение потока. Для каждой вершины, сумма входящего и исходящего потоков равно <tex>0</tex>.
 +
:<tex> \sum\limits_{w \in V} f(u,w) = 0</tex>
  
Суть задачи — найти поток ''f''(''u'', ''v''):
+
{{Задача
 +
|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>p(f) = \sum_{u,v \in V} p(u,v) \cdot f(u,v) - min </tex>.
 
:<tex>|f| = \sum_{u,v \in V} f(u,v) = f_0</tex>
 
}}
 
 
== Алгоритмы решения ==
 
== Алгоритмы решения ==
*Найти любой поток величины <tex>f_0</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|Использование потенциалов Джонсона при поиске потока минимальной стоимости}}
* Дана квадратная матрица <tex>A_{N\times N}</tex>. Нужно выбрать в ней <tex>N</tex> элементов так, чтобы в каждой строке и в каждом столбце был выбран только один элемент, а сумма значений этих элементов была наименьшей.
 
* Имеется <tex>N</tex> заказов и <tex>N</tex> станков. Про каждый заказ известна стоимость его изготовления на каждом станке. На каждом станке можно выполнять только один заказ. Требуется распределить все заказы по станкам так, чтобы минимизировать суммарную стоимость.
 
[[Сведение_задачи_о_назначениях_к_задаче_о_потоке_минимальной_стоимости|Решение]] данной задачи легко сводится к поиску потока минимальной стоимости.
 
  
== Источник ==
+
== См. также ==
* ''Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд'' '''Алгоритмы: построение и анализ''', 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)
+
* [[Сведение задачи о назначениях к задаче о потоке минимальной стоимости|Сведение задачи о назначениях к задаче о потоке минимальной стоимости]]
 +
* [[Венгерский алгоритм решения задачи о назначениях|Венгерский алгоритм решения задачи о назначениях]]
  
== Ссылки ==
+
== Источники информации ==
*[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 (рус.)
  
  
 +
[[Категория:Алгоритмы и структуры данных]]
 
[[Категория: Задача о потоке минимальной стоимости]]
 
[[Категория: Задача о потоке минимальной стоимости]]

Текущая версия на 19:41, 4 сентября 2022

Задача о потоке минимальной стоимости

Определение:
Пусть дана сеть [math]G(V,E)[/math]. [math]S, T \in V[/math] — источник и сток. Ребра [math](u,v) \in E[/math] имееют пропускную способность [math] c(u, v), [/math] поток [math] f(u,v) [/math] и цену за единицу потока [math]a(u, v) [/math]. Тогда общая стоимость потока из [math]S[/math] в [math]T[/math]:
[math]p(u,v) = \sum\limits_{u,v \in V, f(u,v)\gt 0} a(u,v) \cdot f(u,v)[/math]

Свойства сети

  • Поток не может превысить пропускную способность.
[math]f(u,v) \leqslant c(u,v)[/math]
  • Поток из [math]u[/math] в [math]v[/math] должен быть противоположным потоку из [math]v[/math] в [math]u[/math].
[math]f(u, v)=-f(v, u)[/math]
  • Сохранение потока. Для каждой вершины, сумма входящего и исходящего потоков равно [math]0[/math].
[math] \sum\limits_{w \in V} f(u,w) = 0[/math]


Задача:
Дана сеть [math]G(V,E)[/math]. [math]S, T \in V[/math] — источник и сток. Ребра [math](u,v) \in E[/math] имееют пропускную способность [math] c(u, v), [/math] поток [math] f(u,v) [/math] — и цену за единицу потока [math] a(u, v) [/math]. Требуется найти максимальный поток, суммарная стоимость которого минимальна.


Алгоритмы решения

Метод устранения отрицательных циклов в остаточной сети

Воспользуемся леммой об эквивалентности свойства потока быть минимальной стоимости и отсутствии отрицательных циклов в остаточной сети. Получим следующий алгоритм:

Алгоритм

  • Начало.
  • Шаг 1. Определим для каждого прямого ребра [math](u,v)[/math] обратное ребро [math](v,u)[/math]. Определим его характеристики: [math]c(v,u)=0[/math], [math]f(v,u)=-f(u,v)[/math], [math]a(v,u)=-a(u,v)[/math].
  • Шаг 2. Для каждого ребра зададим поток равный [math]0[/math].
  • Шаг 3. Найдем произвольный максимальный поток(любым алгоритмом нахождения максимального потока), построим для него остаточную сеть, где каждому ребру будет соответствовать величина [math]a(u,v) \cdot (c(u,v) - f(u,v))[/math].
  • Шаг 4. При помощи алгоритма Форда-Беллмана найдем отрицательный цикл в построенной сети (отрицательный цикл ищется по стоимости ребра, т.е. ребра имеют вес [math]a(u,v)[/math]). Если отрицательный цикл не нашелся — перейдем к шагу 6.
  • Шаг 5. Избавимся от отрицательного цикла, для этого пустим по нему максимально возможный поток. Величина потока равна минимальной остаточной пропускной способности в цикле. Перейдем к шагу 4.
  • Шаг 6. Отрицательных циклов в остаточной сети нет, значит, максимальный поток минимальной стоимости найден.
  • Конец.

Асимптотика

Алгоритм Форда-Беллмана работает за [math]O(VE)[/math], улучшение цикла за [math]O(E)[/math]. Если обозначить максимальную стоимость потока как [math]C[/math], а максимальную пропускную способность как [math]U[/math], то алгоритм совершит [math]O(ECU)[/math] итераций поиска цикла, если каждое улучшение цикла будет улучшать его на 1. В итоге имеем [math]O(V E^2 C U + maxFlow)[/math], где [math]maxFlow[/math] - асимптотика поиска максимального потока.

Метод дополнения потока вдоль путей минимальной стоимости

Использование потенциалов Джонсона

См. также

Источники информации