圖論(3)--圖論工具箱及應用
Matlab圖論工具箱介紹
命令列表
命令名 | 功能 |
---|---|
graphallshortestpaths | 求圖中所有頂點對之間的最短距離 |
graphconncomp | 找無向圖的連通分支,或有向圖的強弱連通分支 |
graphisdag | 測試有向圖是否含有圈,不含圈返回1,否則返回0 |
graphisomorphism | 確定兩個圖是否同構,同構返回1,否則返回0 |
graphisspantree | 確定一個圖是否是生成樹,是返回1,否則返回0 |
graphmaxflow | 計算有向圖的最大流 |
graphminspantree | 在圖中找最小生成樹 |
graphpred2path | 把前驅頂點序列變成路徑的頂點序列 |
graphshortestpath | 求圖中指定的一對頂點間的最短距離和最短路徑 |
graphtopootder | 執行有向無圈圖的拓撲排序 |
graphtraverse | 求從一頂點出發,所能遍歷圖中的頂點 |
graphallshortestpaths函式
Matlab使用方法
① 根據題目構造權值向量;
② 匹配線段的起始點與相應的權值;
③ 呼叫函式graphallshortestpaths
函式格式
[dist]=graphallshortestpaths(G)
[dist]=graphallshortestpaths(G,...’Directed’,DirectedValue,...)
[dist]=graphallshortestpaths(G,...’Weights’,WeightsValue,...)
DirectedValue屬性
屬性 | 作用 |
---|---|
True | 有向圖(預設) |
False | 無向圖 |
WeightsValue屬性
Weightvalue屬性一般不用指定,函式graphallshortestpath函式預設從稀疏矩陣G中獲取。
graphshortestpaths函式
函式呼叫格式
[dist,path]=graphshortestpaths(G,S,T)
[dist,path]=graphshortestpaths(G,S,T’Directed’,DirectedValue,...)
[dist,path]=graphshortestpaths(G,S,T’Weights’,WeightsValue,...)
函式引數說明
G | 稀疏矩陣 |
---|---|
S | 起點 |
T | 終點 |
Dist | 最短距離 |
path | 最短距離經過的路徑節點 |
最小生成樹graphminspantree函式
函式呼叫格式
[Tree,pred]=graphminspantree(G)
[Tree,pred]=graphminspantree(G,R)
[Tree,pred]=graphminspantree(...,’Method’,MethofValue,...)
[Tree,pred]=graphminspantree(...,’Weights’,WeightsValue,...)
引數說明
該函式用來尋找一個無迴圈的節點集合,連線無向圖的全部節點,並且總的權值最小。
Tree | 一個代表生成樹的稀疏矩陣 |
---|---|
Pred | 包含最小生成的祖先節點的向量 |
G | 稀疏矩陣 |
R | 根節點,取值為1到節點數目 |
Method | 可以選擇‘Kruskal’,’Prim’等演算法 |
圖的遍歷graphtraverse函式
函式呼叫格式
[disc,pred,closed]=graphtraverse(G,S)
[...]=graphtraverse(G,S,...’Directed’,DirectedValue,...)
[...]=graphtraverse(G,S,...’Depth’,DepthValue,...)
[...]=graphtraverse(G,S,...’Method’,MethodValue,...)
引數說明
G | 有向圖的稀疏矩陣 |
---|---|
S | 起始節點 |
Disc | 節點索引向量 |
Pred | 祖先節點索引向量 |
Methodvalue表示遍歷方法:預設為“深度優先遍歷”(DFS和DPS後面會介紹)
返回稀疏矩陣adjacency
函式呼叫格式
A = adjacency(G)
A = adjacency(G,'weighted')
A = adjacency(G,weights)
A = adjacency(G)返回圖 G 的稀疏鄰接矩陣。
A = adjacency(G,'weighted') 返回加權鄰接矩陣,其中對於每條邊 (i,j),值 A(i,j)包含邊的權重。
A = adjacency(G,weights)返回加權鄰接矩陣,其邊權重由向量 weights指定。
具體連結請檢視matlab手冊:圖鄰接矩陣 - MATLAB adjacency - MathWorks 中國
利用圖論工具箱解決最大流,最小費用最大流問題
最大流問題
問題描述
graphmaxflow函式
注意:該工具箱函式權值必須為正,且兩個頂點不能有兩條弧。我們可以在權值最小的那條邊中間插入新的頂點,再將其依次連線,新邊的權值均與原來的權值相等。
函式呼叫格式
[MaxFlow,FlowMatrix,Cut]=graphmaxflow(G,SNode,TNode)
[...]=graphmaxflow(G,SNode,TNode,...’Capacity’,CapacityValue,...)
[...]=graphmaxflow(G,SNode,TNode,...’Method’,MethodValue,...)
函式引數說明
G | N*N的稀疏矩陣 |
---|---|
SNode | 起點 |
TNcode | 目標點 |
CapacityValue屬性 | 每條邊自定義容量的列向量,預設從G中獲取 |
MethodValue屬性 | 可以取‘Edmonds’和‘Goldberg’演算法 |
輸出引數MaxFlow | 網路最大流 |
輸出引數FlowMatrix | 每條邊資料流的值所組成的稀疏矩陣 |
輸出引數cut | 連線起點與目標點的邏輯向量,如果有多個解時,Cut是一個矩陣 |
關於Sparse函式
詳見:https://www.cnblogs.com/Demo1589/p/7881762.html
最小費用最大流問題
問題描述
解決步驟:
- Matlab求出最大流
- Lingo程式碼解決
具體實現
視訊:https://www.bilibili.com/video/BV1sf4y157ZG
這部分就是簡單的呼叫函式,非常簡單~