maxflow
图中的最大流
语法
说明
示例
图中的最大流
创建并绘制一个加权图。加权边表示流量。
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'
使用 Ford-Fulkerson 算法,并使用两个输出以返回非零流的图。
[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'
最大流算法,指定为下表中的条目之一。
注意
对于有向图,您只能指定非默认 algorithm
选项。
选项 | 描述 |
---|---|
'searchtrees' (默认值) | 使用博伊科夫-科尔莫戈洛夫算法。通过构造与节点 |
'augmentpath' | 使用 Ford-Fulkerson 算法。通过求残差有向图中的增广路径,以迭代方式计算最大流。 有向图中相同的两个节点之间不能有相反方向的任何平行边,除非这些边中某条边的权重为零。因此,如果图包含边 |
'pushrelabel' | 通过将某节点的余流推送到其相邻节点并为该节点重新添加标签,计算最大流。 有向图中相同的两个节点之间不能有相反方向的任何平行边,除非这些边中某条边的权重为零。因此,如果图包含边 |
示例: mf = maxflow(G,'A','D','augmentpath')
输出参量
mf
— 最大流
标量
最大流,以标量形式返回。
GF
— 流的有向图
digraph
对象
流的有向图,以 digraph
对象形式返回。GF
包含的节点与 G
相同,但仅包含 G
的具有非零流的边。对于相同的两个节点之间具有多条边的多重图来说,GF
只包含一条边,反映多条边的流向。
cs
— 最小割源节点 ID
节点索引 | 节点名称
最小割源节点 ID,以节点索引或节点名称形式返回。
如果
s
和t
指定数值节点索引,则cs
和ct
也包含节点索引。如果
s
和t
指定节点名称,则cs
和ct
也包含节点名称。
ct
— 最小割目标节点 ID
标量 | 向量 | 字符向量 | 字符向量元胞数组
最小割目标节点 ID,以节点索引或节点名称形式返回。
如果
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)
。
扩展功能
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
版本历史记录
在 R2015b 中推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)