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' を指定してフォード・ファルカーソン アルゴリズムを使用し、2 つの出力を使用して非ゼロ フローのグラフを返します。
[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 ノードを緑で強調表示します。これら 2 セットのノードを連結するエッジの重みが最大フローに等しくなります。
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' |
| string スカラーのノード名 | "A" |
例: mf = maxflow(G,'A','B')
例: mf = maxflow(G,1,10)
データ型: double | char | string
最大フロー アルゴリズム。次の表のいずれかの項目として指定します。
メモ
既定以外の algorithm オプションは、有向グラフにのみ指定できます。
| オプション | 説明 |
|---|---|
'searchtrees' (既定) | ボイコフ・コルモゴロフ アルゴリズムを使用します。ノード |
'augmentpath' | フォード・ファルカーソン アルゴリズムを使用します。残余有向グラフで増加経路を検出することにより、最大フローを繰り返し計算します。 有向グラフでは、エッジのいずれかの重みが 0 でない限り、同じ 2 つのノード間に逆方向の平行エッジを含むことができません。したがって、グラフがエッジ |
'pushrelabel' | ノードの過剰フローを隣接ノードに押し付け、ノードにラベルを付け直すことにより、最大フローを計算します。 有向グラフでは、エッジのいずれかの重みが 0 でない限り、同じ 2 つのノード間に逆方向の平行エッジを含むことができません。したがって、グラフがエッジ |
例: mf = maxflow(G,'A','D','augmentpath')
出力引数
最大フロー。スカラーとして返されます。
フローの有向グラフ。digraph オブジェクトとして返されます。GF は G と同じノードを含みますが、非ゼロ フローをもつ G のエッジのみを含みます。同じ 2 つのノード間に複数のエッジがある多重グラフでは、GF に複数のエッジを通過するフローを表す単一のエッジが含まれます。
最小カットのソース ノード ID。ノード インデックスまたはノード名として返されます。
sとtが数値ノード インデックスを指定する場合、csとctもノード インデックスを含みます。sとtがノード名を指定する場合、csとctもノード名を含みます。
最小カットのターゲット ノード ID。ノード インデックスまたはノード名として返されます。
sとtが数値ノード インデックスを指定する場合、csとctもノード インデックスを含みます。sとtがノード名を指定する場合、csとctもノード名を含みます。
詳細
最大フローのコンテキストでは、グラフ内のエッジは、エッジの重みで表される "容量" をもつと見なされます。エッジの容量は、そのエッジを通過できるフローの量です。したがって、グラフ内の 2 つのノード間の最大フローは、連結エッジの容量に基づいて、ソース ノード s からターゲット ノード t まで通過するフローの量を最大にします。
最小カットは、cs と ct を連結するすべてのエッジの重みの合計 (カットの重み) が最小になるように、有向グラフのノードを 2 つのセット cs および ct に分割します。最小カットの重みは最大フロー値 mf と等しくなります。
cs および ct の要素はそれぞれ、ノード s および t に対応する G のノードを示します。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.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の 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)