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: [6×2 table]
Nodes: [5×0 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')

输入参数
节点对组,指定为单独的节点索引或节点名称参量,用于指示源节点和目标节点。下表显示通过节点索引或节点名称引用节点的不同方法。
| 值 | 示例 |
|---|---|
| 标量节点索引 | 1 |
| 字符向量节点名称 | 'A' |
| 字符串标量节点名称 | "A" |
示例: mf = maxflow(G,'A','B')
示例: mf = maxflow(G,1,10)
数据类型: double | char | string
最大流算法,指定为下表中的条目之一。
注意
对于有向图,您只能指定非默认 algorithm 选项。
| 选项 | 描述 |
|---|---|
'searchtrees'(默认值) | 使用博伊科夫-科尔莫戈洛夫算法。通过构造与节点 |
'augmentpath' | 使用 Ford-Fulkerson 算法。通过求残差有向图中的增广路径,以迭代方式计算最大流。 有向图中相同的两个节点之间不能有相反方向的任何平行边,除非这些边中某条边的权重为零。因此,如果图包含边 |
'pushrelabel' | 通过将某节点的余流推送到其相邻节点并为该节点重新添加标签,计算最大流。 有向图中相同的两个节点之间不能有相反方向的任何平行边,除非这些边中某条边的权重为零。因此,如果图包含边 |
示例: mf = maxflow(G,'A','D','augmentpath')
输出参量
最大流,以标量形式返回。
流的有向图,以 digraph 对象形式返回。GF 包含的节点与 G 相同,但仅包含 G 的具有非零流的边。对于相同的两个节点之间具有多条边的多重图来说,GF 只包含一条边,反映多条边的流向。
最小割源节点 ID,以节点索引或节点名称形式返回。
如果
s和t指定数值节点索引,则cs和ct也包含节点索引。如果
s和t指定节点名称,则cs和ct也包含节点名称。
最小割目标节点 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 Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- 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)