1 / 10

Потоки в сетях.

Потоки в сетях. Сеть – это ориентированный нагруженный граф, в котором нагрузка имеет интерпретацию «пропускная способность» (разумеется, положительная; можно считать, что отсутствующее ребро соответствует нулевой нагрузке). Будем обозначать эту нагрузку c (u, v). 12/12. 12. 1. 2. 11/16.

nuru
Télécharger la présentation

Потоки в сетях.

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Потоки в сетях. Сеть – это ориентированный нагруженный граф, в котором нагрузка имеет интерпретацию«пропускная способность» (разумеется, положительная; можно считать, что отсутствующее ребро соответствует нулевой нагрузке). Будем обозначать эту нагрузку c (u, v). 12/12 12 1 2 11/16 16 15/20 20 И 1/4 С 4 10 7/7 7 9 4/9 8/13 13 4 4/4 3 4 11/14 14 Мы будем считать, чтоa) в сети есть две выделенные вершины – исток (только исходящие дуги) и сток (только входящие дуги); b) любая вершина лежит на каком-нибудь пути из истока в сток (нет «бесполезных» вершин). Поток в сети – это задание некоторой дополнительной нагрузки на ребра. Свойства потока:a) поток по ребру не может превышать пропускной способности ребра и всегда неотрицателен; b) в любую вершину (кроме истока и стока) количество втекающей жидкости равно количеству вытекающей. Величина потока – это сумма исходящего потока из истока. Очевидно, она равна сумме входящего потока в сток. Основная задача – найти максимальный поток в сети с заданнойпропускной способностью.

  2. Потоки в сетях. Пусть задана сеть и поток в ней. Свяжем с потоком функцию f (u, v), обладающую следующими свойствами: 12/12 1 2 11/16 15/20 И 1/4 С 10 7/7 4/9 8/13 4/4 3 4 11/14 a) если по ребру (u,v) идет поток величиной c, то положим f (u, v) = c, f (v, u) = -c; b) если есть два «встречных» потока c1 и c2 по ребрам (u, v) и (v, u) соответственно, то полагаем f (u, v) = c1-c2. На самом деле всегда можно считать, что на самом деле есть только один поток величиной |c1-c2|. На приведенной выше картинке: f (И, 3) = 8; f (3, 2) = -4; f (1, 3) = -1. Для каждого ребра (при заданном потоке f) определим также его «остаточную пропускную способность»: cf(u, v) = c (u, v) – f(u, v) Например, для заданного потока cf(3, 4) = 3, cf(1, 3) = 11.

  3. Метод Форда – Фалкерсона Будем искать дополняющие пути из истока в сток, по которому можно пропуститьдополнительное количество вещества. Тогда схема алгоритма может быть записанаследующим образом: f = 0; while (существует дополняющий путь p) { дополнить f вдоль p; } Для поиска дополняющих путей найдем все остаточные пропускные способности ребер сетии составим остаточную сеть из всех положительных величин: 12/12 12 1 1 2 2 5 5 11/16 15/20 11 15 5 И И 1/4 С С 7 11 10 3 7/7 4/9 8 4 5 8/13 4 4/4 3 3 4 3 4 11/14 11 12/12 1 2 11/16 19/20 И 1/4 С 10 7/7 9 12/13 4/4 3 4 11/14

  4. Пример реализации метода Форда – Фалкерсона 12/12 12 12 1 2 1 2 4 12/16 20 16 12/20 8 12 И 12 И С С 10 4 10 4 9 7 9 7 13 13 4 4 3 4 3 4 14 14 12/12 12 1 2 1 2 4 12/16 19/20 1 12 И 19 И С С 10 4 7/7 10 4 9 9 7 6 7/13 4 7 4 7 3 4 3 4 7/14 7 12/12 12 1 2 1 2 4 12/16 19/20 1 12 19 И И С С 10 10 4 7/7 4 9 9 7 4 11/13 4/4 3 4 3 4 11 3 4 11/14 11

  5. Выбор дополняющего пути в методе Форда – Фалкерсона Если выбор дополняющего пути производится не очень удачно, то процедура поискамаксимального потока может затянуться. 1 1 1 000 000 999 999 1/1 000 000 1 000 000 1 000 000 С 1 С И 1/1 1 1 И 1 999 999 1 000 000 2 1/1 000 000 1 000 000 1 000 000 2 1 1/1 000 000 1/1 000 000 и так далее, всего 2 000 000 шагов… С 1 И 1/1 000 000 2 1/1 000 000 Можно попробовать искать кратчайший (по числу ребер) дополняющий путь между истоком и стоком. Например, с помощью поиска в ширину. Получающийся при этом алгоритм(реализация метода Форда – Фалкерсона) называется алгоритмом Эдмондса – Карпа). Можно показать, что в алгоритме Эдмондса – Карпа число шагов ограничено сверху числом2nm, где m – число ребер в сети, а n – число вершин. Поскольку поиск в ширину, изменениепотоков вдоль ребер и построение остаточной сети требуют времени O(m), то общее времяработы алгоритма можно оценить как O(m2n).

  6. Сеть с несколькими истоками и стоками Если в графе есть несколько истоков и/или несколько стоков, то задача нахождениямаксимального потока в такой сети сводится к задаче с одним истоком и одним стоком. 1 3 8 5 10 15 И1 21 11 ∞ 12 С1 2 ∞ 17 13 18 ∞ 6 С И2 И 12 12 27 18 ∞ 13 ∞ 3 С2 9 15 17 20 И3 4 7 17 22 4

  7. Максимальное паросочетание в двудольном графе Метод Форда – Фалкерсона можно использовать и для решения других задач, например, дляпоиска максимального паросочетания в двудольном графе. Паросочетание – это множество ребер в двудольном графе, при котором каждая вершина связана не более, чем с одним ребром из этого множества. a1 b1 a2 Максимальное паросочетание – это паросочетаниес наибольшим числом ребер. b2 a3 b3 a4 b4 a5

  8. Применение метода Форда – Фалкерсона для нахождения максимальногопаросочетания Добавим в граф две вершины – исток и сток – так, как показано на рисунке. Пропускную способность всех ребер полагаем равной единице. Тогда максимальный поток определитмаксимальное паросочетание в этом графе. a1 b1 a2 b2 И a3 С b3 a4 b4 a5

  9. Проталкивание предпотока для нахождения максимального потока Сначала исток поднимается на высоту, равную общему числу вершин, и в соседние с нимвершины заливается максимальное количество жидкости. Вершина, в которой есть избыток жидкости, поднимается на минимально возможную высоту,с которой можно слить жидкость в одну из соседних вершин по остаточной сети. Жидкость сливается по одному из возможных ребер остаточной сети. И так далее... Работа алгоритма прекращается, когда в сети не остается больше «избыточных» вершин.В процессе работы жидкость может возвращаться назад к истоку, уменьшая общую начальнуювеличину потока. 6 5 4 13/13 16/16 16/16 3 3/10 2 10 13 4/10 10 10 12/12 10 1 4 12 12/12 9/9 9 14 16 12 9 4 0 16 12 13 26 17 3 И С 4 7 4 7

  10. Реализация алгоритма проталкивания предпотока for (int i = 0; i < n; ++i) { h[i] = 0; e[i] = 0; } h[s] = n; for (Arc arc : arcs) { int u = arc.start; v = arc.end; f[u,v] = f[v,u] = 0; } for (int u : adj(s)) { f[s,u] = c[s,u]; f[u,s] = -c[s,u]; e[u] = c[s,u]; } while (есть избыточные вершины) { for (int u : excs) { if (возможно проталкивание избытка) протолкнуть избыток; else поднять вершину; } } Никакая вершина не может быть поднята на высоту, большую или равную 2n. Поэтому общее число операций подъема не может быть больше 2n2. Можно показать, что общее число операций оценивается как O(n2m), что лучше, чем в алгоритмеЭдмондса – Карпа (O(nm2)).

More Related