graphshortestpath尋找最短路徑的代碼實現以及原理分析

一、 句柄的相關概念的理解
句柄的相關概念參照我的另一篇博客:https://blog.csdn.net/xiaofeiyu321/article/details/89791451
二、尋徑算法的代碼實現

% 路線權的定義
w = [2 1 8 6 1 7 9 5 1 2 3 9 4 6 3];
% 鄰接矩陣的構造
DG = sparse([1 1 1 2 2 3 3 4 4 4 5 5 6 6 7],[2 3 4 4 5 4 7 5 6 7 6 8 7 8 8],w,8,8);
first = input('請輸入初始節點:');
last = input('請輸入終止節點:');
% 有向賦權圖的繪製
h = view(biograph(DG,[],'ShowWeights','on'));
[dist,path,pred] = graphshortestpath(DG,first,last);
% 標記路線經過的節點
set(h.Nodes(path),'Color',[1 0.6 0.6]);
% 標記路線經過的路徑
edges = getedgesbynodeid(h,get(h.Nodes(path),'ID'),get(h.Nodes(path),'ID'));
set(edges,'LineColor',[1 0 0]);
set(edges,'LineWidth',2.0);

%% 關於代碼實現的解釋
1、DG = sparse([1 1 1 2 2 3 3 4 4 4 5 5 6 6 7],[2 3 4 4 5 4 7 5 6 7 6 8 7 8 8],w,8,8);
sparse(i,j,v,m,n) 根據 i、j 和 v 三元組生成稀疏矩陣 S,以便 S(i(k),j(k)) = v(k),將 S 的大小指定爲 m×n。通常需要指定鄰接矩陣的維數 ,否則會出現報錯。
在這裏插入圖片描述
關於sparse的具體用法以及原理可以參照:https://baike.baidu.com/item/sparse/2920926
DG是個8*8的矩陣,第一行表示節點起點,第二行表示節點終點,w是權值,因爲這樣創建的矩陣是一個上三角矩陣,構造的是一個有向圖。
無向圖需要這樣操作:UG=tril(DG+DG’);就是把G和自己的轉置DG’加起來再求下三角矩陣。得到的是一個完整的矩陣,節點之間可以相互到達,沒有方向。
2、h = view(biograph(DG,[],'ShowWeights','on'));
BG = biograph(CM,IDs)這條語句設置節點的序號名稱。IDs可以使一個元胞數組,數組中每個元素表示一個名字,數組長度與CM矩陣行列長度一致。IDs也可以是一個字符數組(此時各個節點的名字長度相同)。IDs必須是唯一的,不能重複。
根據DG矩陣構建路線圖,[ ]中可以通過輸入元胞數組的形式對節點進行命名。
例如:{'城市1','城市2','城市3','城市4','城市5','城市6','城市7','城市8'}
'ShowWeights','on'控制指示邊緣權重的文本顯示。 選擇是“開啓”或“關閉”(默認)。
h = view(biograph) 打開一個圖窗口並繪製一個由Biograph對象表示的圖形,在圖窗口中返回Biograph對象的深層副本的句柄。 更新現有圖形時,可以使用返回的句柄以編程方式或從命令行更改對象屬性。 關閉圖窗口時,句柄不再有效。 原始的Biograph對象保持不變。
在這裏插入圖片描述
3、[dist,path,pred] = graphshortestpath(DG,first,last);
DG是稀疏矩陣,first是起點,last是終點。
dist表示最短距離,path表示最短距離經過的路徑節點,pred表示從first到每個節點的最短路徑中,目標節點的先驅,即目標節點的前面一個節點。
4、set(h.Nodes(path),'Color',[1 0.6 0.6]);
根據grapnshortestpath中返回的path,對相關節點進行修改操作。例如可以改變顏色。
[1 0.6 0.6]:matlab中的顏色可以使用三維向量表示,爲[r g b],其中各個元素的取值在0到1之間,r爲紅色,g爲綠色,b爲藍色,它和我們常用的使用256表示的顏色是一一對應的。
5、edges = getedgesbynodeid(h,get(h.Nodes(path),'ID'),get(h.Nodes(path),'ID'));
getedgesbynodeid,從英文本意上理解爲:按節點ID獲取邊緣,我們不難知道它的用法
關於代碼edges = getedgesbynodeid(h,get(h.Nodes(path),'ID'),get(h.Nodes(path),'ID'));實測與edges = getedgesbynodeid(h,get(h.Nodes(path),'ID'));實現效果一致。

EDGES = getedgesbynodeid(BIOGRAPH,SOURCE_IDS,SINK_IDS) gets the edge
handles that connect any of the nodes' SOURCE_IDS to any of the nodes'
SINK_IDS. SOURCE_IDS and SINK_IDS can be either strings, cell strings,
or empty strings (gets all).

% 獲取連接任何節點的source_id到任何節點的sink_id的邊緣句柄。
% source_id和sink_id可以是字符串、單元格字符串或空字符串(獲取所有字符串)。

三、set、get的用法總結
set:設置圖形對象屬性
set(H,Name,Value) 爲 H 標識的對象指定其 Name屬性的值。使用時須用單引號將屬性名引起來,例如,set(H,'Color','red')。如果 H 是對象的向量,則 set 會爲所有對象設置屬性。如果 H 爲空(即 []),set 不執行任何操作,但不返回錯誤或警告。
set(H,NameArray,ValueArray) 使用元胞數組 NameArrayValueArray指定多個屬性值。要爲 m 個圖形對象中的每個圖形對象設置 n 個屬性值,請將ValueArray 指定爲 m×n 的元胞數組,其中 m = length(H),而 n 等於 NameArray 中包含的屬性名的數量。
get:查詢圖形對象屬性
v = get(h) 返回 h 標識的圖形對象的所有屬性和屬性值。
v = get(h,propertyName) 返回特定屬性 propertyName 的值。使用時須用單引號將屬性名引起來,例如,get(h,'Color')
在這裏插入圖片描述
在這裏插入圖片描述
最後的實現效果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章