Максимальный поток в графике
возвращает максимальный поток между узлами mf
= maxflow(G
,s,t
)s
и t
. Если графиков G
невзвешенный (то есть G.Edges
не содержит переменную Weight
), затем maxflow
рассматривает все ребра графика как имеющие вес, равный 1.
Создайте и постройте график взвешенности. Взвешенные ребра представляют мощности потока.
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');
Определите максимальный поток от узла 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);
Найдите максимальное значение потока между узлом 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);
Создайте и постройте график взвешенности. Веса кромок представляют пропускную способность потока.
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')
Найдите максимальный поток и минимальный разрез графика.
[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')
s,t
- Пара узлов (как отдельные аргументы)Пара узлов, заданная как отдельные аргументы индексов узлов или имен узлов для указания исходного узла и целевого узла. В этой таблице показаны различные способы обращения к узлам либо по их индексам узлов, либо по именам узлов.
Значение | Пример |
---|---|
Скалярный индекс узла | 1 |
Имя узла вектора символов | 'A' |
Строковое скалярное имя узла | "A" |
Пример: mf = maxflow(G,'A','B')
Пример: mf = maxflow(G,1,10)
Типы данных: double
| char
| string
algorithm
- Алгоритм максимального расхода'searchtrees'
(по умолчанию) | 'augmentpath'
| 'pushrelabel'
Алгоритм максимального расхода, заданный как одна из записей в таблице.
Примечание
Вы можете задать только nondefault algorithm
опции с ориентированным графом.
Опция | Описание |
---|---|
'searchtrees' (по умолчанию) |
Использует алгоритм Бойкова - Колмогорова. Вычисляет максимальный поток путем создания двух деревьев поиска, сопоставленных с узлами |
'augmentpath' |
Использует алгоритм Форда-Фулкерсона. Итеративно вычисляет максимальное течение путем нахождения увеличивающего пути в невязочном ориентированном графе. Ориентированный граф не может иметь никаких параллельных ребер противоположного направления между теми же двумя узлами, если только вес одного из этих ребер не равен нулю. Итак, если график содержит ребро |
'pushrelabel' |
Вычисляет максимальный поток путем проталкивания избыточного потока узла к его соседям и последующего повторного маркировки узла. Ориентированный граф не может иметь никаких параллельных ребер противоположного направления между теми же двумя узлами, если только вес одного из этих ребер не равен нулю. Итак, если график содержит ребро |
Пример: mf = maxflow(G,'A','D','augmentpath')
mf
- Максимальный расходМаксимальный поток, возвращенный как скаляр.
GF
- Ориентированный график потоковdigraph
объектОриентированный граф потоков, возвращенный как digraph
объект. GF
содержит те же узлы, что и G
, но содержит только эти ребра G
которые имеют ненулевой поток. Для мультиграфиков с несколькими ребрами между этими же двумя узлами, GF
содержит одно ребро, отражающую поток через несколько ребра.
cs
- Минимальные идентификаторы исходных узлов разрезаМинимальный размер исходных идентификаторов узла, возвращаемый как индексы узлов или имена узлов.
Если s
и t
задайте числовые индексы узлов, затем cs
и ct
также содержат индексы узлов.
Если s
и t
задайте имена узлов, затем cs
и ct
также содержат имена узлов.
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)
.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.