graphshortestpath 尋找最短路徑的代碼實現(xiàn)

一画机、句柄的相關概念的理解

句柄的相關概念參照我的另一篇文章:Matlab 句柄相關概念總結

二、尋徑算法的代碼實現(xiàn)

% 路線權的定義
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('請輸入初始節(jié)點:');
last = input('請輸入終止節(jié)點:');
% 有向賦權圖的繪制
h = view(biograph(DG,[],'ShowWeights','on'));
[dist,path,pred] = graphshortestpath(DG,first,last);
% 標記路線經(jīng)過的節(jié)點
set(h.Nodes(path),'Color',[1 0.6 0.6]);
% 標記路線經(jīng)過的路徑
edges = getedgesbynodeid(h,get(h.Nodes(path),'ID'),get(h.Nodes(path),'ID'));
set(edges,'LineColor',[1 0 0]);
set(edges,'LineWidth',2.0);

%% 關于代碼實現(xiàn)的解釋
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) 根據(jù) i、j 和 v 三元組生成稀疏矩陣 S,以便 S(i(k), j(k)) = v(k)渗钉,將 S 的大小指定為 m×n。圖論矩陣必須要用稀疏矩陣钞钙。通常需要指定鄰接矩陣的維數(shù) 鳄橘,否則會出現(xiàn)報錯。

運行結果

關于 sparse 的具體用法以及原理可以參照:稀疏矩陣-百度百科
DG 是個 8*8 的矩陣歇竟,第一行表示節(jié)點起點挥唠,第二行表示節(jié)點終點,w 是權值焕议,因為這樣創(chuàng)建的矩陣是一個上三角矩陣宝磨,構造的是一個有向圖。
無向圖需要這樣操作:在 graphshortestpath 函數(shù)設置方向盅安,‘Directed’唤锉,0,關閉默認的有向圖得到的是一個完整的矩陣别瞭,節(jié)點之間可以相互到達窿祥,沒有方向。但直接導入鄰接矩陣的話蝙寨,矩陣返回的是一個雙向的路徑圖晒衩,選定節(jié)點到其他節(jié)點分別有兩條路徑。大家可以嘗試去實現(xiàn)看一下效果墙歪。關于無向賦權圖的代碼實現(xiàn)听系,可以通過h = view(biograph(DG,[],'ShowArrows','off','ShowWeights','on'));關閉 'ShowArrows' 箭頭顯示。

2虹菲、h = view(biograph(DG,[],'ShowWeights','on'));
BG = biograph(CM,IDs)這條語句設置節(jié)點的序號名稱靠胜。IDs 可以使一個元胞數(shù)組,數(shù)組中每個元素表示一個名字毕源,數(shù)組長度與 CM 矩陣行列長度一致浪漠。IDs 也可以是一個字符數(shù)組(此時各個節(jié)點的名字長度相同)。IDs 必須是唯一的霎褐,不能重復址愿。
根據(jù) DG 矩陣構建路線圖,[ ] 中可以通過輸入元胞數(shù)組的形式對節(jié)點進行命名瘩欺。
例如:{'城市1','城市2','城市3','城市4','城市5','城市6','城市7','城市8'}
'ShowWeights','on'控制指示邊緣權重的文本顯示必盖。 選擇是 “開啟” 或 “關閉”(默認)拌牲。
h = view(biograph) 打開一個圖窗口并繪制一個由 Biograph 對象表示的圖形,在圖窗口中返回 Biograph 對象的深層副本的句柄歌粥。 更新現(xiàn)有圖形時塌忽,可以使用返回的句柄以編程方式或從命令行更改對象屬性。 關閉圖窗口時失驶,句柄不再有效土居。 原始的 Biograph 對象保持不變。

3嬉探、[dist,path,pred] = graphshortestpath(DG,first,last);
DG 是稀疏矩陣擦耀,first 是起點,last 是終點涩堤。
dist 表示最短距離眷蜓,path 表示最短距離經(jīng)過的路徑節(jié)點,pred 表示從 first 到每個節(jié)點的最短路徑中胎围,目標節(jié)點的先驅吁系,即目標節(jié)點的前面一個節(jié)點。

4白魂、set(h.Nodes(path),'Color',[1 0.6 0.6]);
根據(jù) grapnshortestpath 中返回的 path汽纤,對相關節(jié)點進行修改操作。例如可以改變顏色福荸。
[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谒养,從英文本意上理解為:按節(jié)點 ID 獲取邊緣,我們不難知道它的用法
關于代碼edges = getedgesbynodeid(h,get(h.Nodes(path),'ID'),get(h.Nodes(path),'ID'));實測與edges = getedgesbynodeid(h,get(h.Nodes(path),'ID'));實現(xiàn)效果一致明郭。

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).

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

三始绍、set、get的用法總結

set:設置圖形對象屬性
set(H,Name,Value) 為 H 標識的對象指定其 Name屬性的值话侄。使用時須用單引號將屬性名引起來亏推,例如学赛,set(H,'Color','red')。如果 H 是對象的向量吞杭,則 set 會為所有對象設置屬性盏浇。如果 H 為空(即 []),set 不執(zhí)行任何操作芽狗,但不返回錯誤或警告绢掰。
set(H,NameArray,ValueArray) 使用元胞數(shù)組 NameArrayValueArray指定多個屬性值。要為 m 個圖形對象中的每個圖形對象設置 n 個屬性值童擎,請將ValueArray 指定為 m×n 的元胞數(shù)組滴劲,其中 m = length(H),而 n 等于 NameArray 中包含的屬性名的數(shù)量顾复。

get:查詢圖形對象屬性
v = get(h) 返回 h 標識的圖形對象的所有屬性和屬性值班挖。
v = get(h,propertyName) 返回特定屬性 propertyName 的值。使用時須用單引號將屬性名引起來芯砸,例如萧芙,get(h,'Color')

最后的實現(xiàn)效果:

尋徑完成
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末乙嘀,一起剝皮案震驚了整個濱河市末购,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌虎谢,老刑警劉巖盟榴,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異婴噩,居然都是意外死亡擎场,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進店門几莽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迅办,“玉大人,你說我怎么就攤上這事章蚣≌酒郏” “怎么了?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵纤垂,是天一觀的道長矾策。 經(jīng)常有香客問我,道長峭沦,這世上最難降的妖魔是什么贾虽? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮吼鱼,結果婚禮上蓬豁,老公的妹妹穿的比我還像新娘绰咽。我一直安慰自己,他們只是感情好地粪,可當我...
    茶點故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布取募。 她就那樣靜靜地躺著,像睡著了一般驶忌。 火紅的嫁衣襯著肌膚如雪矛辕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天付魔,我揣著相機與錄音聊品,去河邊找鬼。 笑死几苍,一個胖子當著我的面吹牛翻屈,可吹牛的內容都是我干的。 我是一名探鬼主播妻坝,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼伸眶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刽宪?” 一聲冷哼從身側響起厘贼,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎圣拄,沒想到半個月后嘴秸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡庇谆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年岳掐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饭耳。...
    茶點故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡串述,死狀恐怖,靈堂內的尸體忽然破棺而出寞肖,到底是詐尸還是另有隱情纲酗,我是刑警寧澤,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布新蟆,位于F島的核電站耕姊,受9級特大地震影響,放射性物質發(fā)生泄漏栅葡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一尤泽、第九天 我趴在偏房一處隱蔽的房頂上張望欣簇。 院中可真熱鬧规脸,春花似錦、人聲如沸熊咽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽横殴。三九已至被因,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衫仑,已是汗流浹背梨与。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留文狱,地道東北人粥鞋。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像瞄崇,于是被迫代替她去往敵國和親呻粹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,587評論 2 350

推薦閱讀更多精彩內容