exponenta event banner

maxflow

Максимальный расход на графике

Описание

пример

mf = maxflow(G,s,t) возвращает максимальный поток между узлами s и t. Если график G невзвешенный (то есть G.Edges не содержит переменную Weight), то maxflow рассматривает все рёбра графа как имеющие вес, равный 1.

пример

mf = maxflow(G,s,t,algorithm) задает алгоритм максимального расхода. Этот синтаксис доступен только в том случае, если G является направленным графом.

пример

[mf,GF] = maxflow(___) также возвращает направленный объект графа, GF, используя любой из входных аргументов в предыдущих синтаксисах. GF формируется только с использованием кромок в G которые имеют ненулевые значения расхода.

пример

[mf,GF,cs,ct] = maxflow(___) дополнительно возвращает идентификаторы исходного и целевого узлов, cs и ct, представляющий минимальный разрез, связанный с максимальным потоком.

Примеры

свернуть все

Создание и печать взвешенного графика. Взвешенные кромки представляют пропускную способность потока.

s = [1 1 2 2 3 4 4 4 5 5];
t = [2 3 3 4 5 3 5 6 4 6];
weights = [0.77 0.44 0.67 0.75 0.89 0.90 2 0.76 1 1];
G = digraph(s,t,weights);
plot(G,'EdgeLabel',G.Edges.Weight,'Layout','layered');

Figure contains an axes. The axes contains an object of type graphplot.

Определите максимальный поток от узла 1 к узлу 6.

mf = maxflow(G,1,6)
mf = 1.2100

Создайте и постройте график. Взвешенные кромки представляют пропускную способность потока.

s = [1 1 2 2 3 3 4];
t = [2 3 3 4 4 5 5];
weights = [10 6 15 5 10 3 8];
G = digraph(s,t,weights);
H = plot(G,'EdgeLabel',G.Edges.Weight);

Figure contains an axes. The axes contains an object of type graphplot.

Найдите максимальное значение потока между узлом 1 и узлом 5. Определить 'augmentpath' для использования алгоритма Форда-Фулькерсона и двух выходных сигналов для возврата графика ненулевых потоков.

[mf,GF] = maxflow(G,1,5,'augmentpath')
mf = 11
GF = 
  digraph with properties:

    Edges: [6x2 table]
    Nodes: [5x0 table]

Выделите и пометьте график ненулевых потоков.

H.EdgeLabel = {};
highlight(H,GF,'EdgeColor','r','LineWidth',2);
st = GF.Edges.EndNodes;
labeledge(H,st(:,1),st(:,2),GF.Edges.Weight);

Figure contains an axes. The axes contains an object of type graphplot.

Создание и печать взвешенного графика. Граничные веса представляют пропускную способность потока.

s = [1 1 2 3 3 4 4 5 5];
t = [2 3 3 2 5 5 6 4 6];
weights = [0.77 0.44 0.67 0.69 0.73 2 0.78 1 1];
G = digraph(s,t,weights);
plot(G,'EdgeLabel',G.Edges.Weight,'Layout','layered')

Figure contains an axes. The axes contains an object of type graphplot.

Найдите максимальный поток и минимальный разрез графика.

[mf,~,cs,ct] = maxflow(G,1,6)
mf = 0.7300
cs = 3×1

     1
     2
     3

ct = 3×1

     4
     5
     6

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

H = plot(G,'Layout','layered','Sources',cs,'Sinks',ct, ...
    'EdgeLabel',G.Edges.Weight);
highlight(H,cs,'NodeColor','red')
highlight(H,ct,'NodeColor','green')

Figure contains an axes. The axes contains an object of type graphplot.

Входные аргументы

свернуть все

Входной график, указанный как graph или digraph объект. Использовать graph для создания неориентированного графика или digraph для создания направленного графа.

Пример: G = graph(1,2)

Пример: G = digraph([1 2],[2 3])

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

СтоимостьПример
Индекс скалярного узла1
Имя узла вектора символов'A'
Имя скалярного узла строки"A"

Пример: mf = maxflow(G,'A','B')

Пример: mf = maxflow(G,1,10)

Типы данных: double | char | string

Алгоритм максимального расхода, указанный как одна из записей в таблице.

Примечание

Можно указать только не по умолчанию algorithm опции с направленным графом.

ВыборОписание
'searchtrees' (по умолчанию)

Использует алгоритм Бойкова - Колмогорова. Вычисляет максимальный поток путем построения двух деревьев поиска, связанных с узлами s и t.

'augmentpath'

Использует алгоритм Форда - Фулкерсона. Вычисляет максимальный поток итеративно, найдя увеличивающий путь в остаточном направленном графе.

Направленный граф не может иметь параллельные рёбра противоположного направления между теми же двумя узлами, если вес одного из этих рёбер не равен нулю. Так, если граф содержит ребро [i j], то он может содержать обратный край [j i] только если вес [i j] равно нулю и/или весу [j i] равно нулю.

'pushrelabel'

Вычисляет максимальный поток, перемещая избыточный поток узла к соседям, а затем повторно маркируя узел.

Направленный граф не может иметь параллельные рёбра противоположного направления между теми же двумя узлами, если вес одного из этих рёбер не равен нулю. Так, если граф содержит ребро [i j], то он может содержать обратный край [j i] только если вес [i j] равно нулю и/или весу [j i] равно нулю.

Пример: mf = maxflow(G,'A','D','augmentpath')

Выходные аргументы

свернуть все

Максимальный поток, возвращаемый как скаляр.

Направленный график потоков, возвращаемый как digraph объект. GF содержит те же узлы, что и G, но содержит только те края G с ненулевым потоком. Для мультиграфов с несколькими ребрами между одними и теми же двумя узлами, GF содержит одну кромку, отражающую поток через несколько кромок.

Минимальные идентификаторы исходных узлов, возвращаемые в виде индексов узлов или имен узлов.

  • Если s и t укажите числовые индексы узлов, затем cs и ct также содержат индексы узлов.

  • Если s и t укажите имена узлов, затем cs и ct также содержат имена узлов.

Минимальные идентификаторы конечных узлов, возвращаемые в виде индексов узлов или имен узлов.

  • Если s и t укажите числовые индексы узлов, затем cs и ct также содержат индексы узлов.

  • Если s и t укажите имена узлов, затем cs и ct также содержат имена узлов.

Подробнее

свернуть все

Максимальный расход

В контексте максимального потока считается, что рёбра на графике имеют емкость, представленную весом рёбер. Пропускная способность кромки - это величина потока, который может проходить через эту кромку. Поэтому максимальный поток между двумя узлами на графике максимизирует величину потока, проходящего от исходного узла, s, к целевому узлу, t, исходя из пропускной способности соединительных кромок.

Минимальный вырез

Минимальное вырезание секционирует направленные узлы графа на два набора, cs и ct, таким образом, что сумма весов всех краев, соединяющих cs и ct (вес разреза) минимизирован. Вес минимального погона равен максимальному значению расхода, mf.

Записи в cs и ct указать узлы G связанные с узлами s и tсоответственно. cs и ct удовлетворить numel(cs) + numel(ct) = numnodes(G).

См. также

|

Представлен в R2015b