最短路径和距离及可视化——matlab
文章目錄
一、前言
二、最短路線
2.1 教程
2.1.1 sparse創建稀疏矩陣
2.1.2 有向圖最短路徑(1)
2.1.3 有向圖最短路徑(2)
2.1.4 無向圖最短路徑(1)
2.1.5無向圖最短路徑(2)
一、前言
動態規劃是求解某類問題的一種方法,是考察問題的一種途徑,而不是一種特殊算法(如線性規劃是一種算法)。因而,它不象線性規劃那樣有一個標準的數學表達式和明確定義的一組規則,而必須對具體問題進行具體分析處理。因此,在學習時,除了要對基本概念和方法正確理解外,應以豐富的想象力去建立模型,用創造性的技巧去求解。
二、最短路線
2.1 教程
2.1.1 sparse創建稀疏矩陣
比如我們有這樣的無向圖:
?代碼:
%w(起點,終點)=權重值clear all clc w=zeros(4); w(1,2)=2;w(1,3)=3;w(1,4)=8; w(2,3)=6;w(2,4)=6; G=sparse(w)運行結果:
?或者這樣創建稀疏矩陣:
clear all clc %sparse([起點集合],[對應終點集合],[對應權重集合]) G = sparse([1 1 1 2 2],[2 3 4 3 4],[2 3 8 6 6]); s=sparse(G)運行結果:? 可以看出與上面一樣
2.1.2 有向圖最短路徑(1)
使用函數:graphallshortestpaths,其語法如下:
參數含義:
G:稀疏矩陣
0/false代表無向圖 1/true代表有向圖。默認為true。
我們要解決如下問題:
首先創建一個有向圖:
代碼:
clear all clc G = sparse([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],[41 99 51 32 15 45 38 32 36 29 21]) view(biograph(G,[],'ShowWeights','on'))運行結果:
?第二步:找出有向圖中每對節點之間的所有最短路徑。
使用graphallshortestpaths函數,只需要加一行代碼即可:
clear all clc G = sparse([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],[41 99 51 32 15 45 38 32 36 29 21]) view(biograph(G,[],'ShowWeights','on')) %添加代碼如下 graphallshortestpaths(G)運行結果:
?那返回的結果什么意思呢?
比如說第一行代表的意思就是節點一分別到節點六的距離。為什么第一個值為0?節點一到節點一當然在原位置了,肯定為0咯。第二行類似一樣的道理。
因此:從節點一到節點六最短距離為多少呢?最短距離為95可以從返回表中一眼看出來。留個問題:節點二到節點一位111怎么得到的?路徑位?
根據結果推路徑:
第一行推出:節點一先到節點五,此時距離為21(為么選節點五?因為節點一到節點五最短,每次都選擇最短)
然后我們再跳到第五行:節點五要先到節點四,距離為36?
于是我們再跳到第四行:節點四要先到節點六,距離為38
?此時我們已經完成節點一到節點六距離為:
21+36+38=95
路徑為:1—5—4—6
下面我在介紹一個新的方法,會更簡單!
2.1.3 有向圖最短路徑(2)
保存該函數:dijkstra.m(你不需要修改,知道這個函數具體意思,我們調用它就行)
function [min,path]=dijkstra(w,start,terminal) n=size(w,1); label(start)=0; f(start)=start; for i=1:nif i~=startlabel(i)=inf; end, end s(1)=start; u=start; while length(s)<nfor i=1:nins=0;for j=1:length(s)if i==s(j)ins=1;endendif ins==0v=i;if label(v)>(label(u)+w(u,v))label(v)=(label(u)+w(u,v)); f(v)=u;end endend v1=0;k=inf;for i=1:nins=0;for j=1:length(s)if i==s(j)ins=1;endendif ins==0v=i;if k>label(v)k=label(v); v1=v;endendends(length(s)+1)=v1; u=v1; end min=label(terminal); path(1)=terminal; i=1; while path(i)~=startpath(i+1)=f(path(i));i=i+1 ; end path(i)=start; L=length(path); path=path(L:-1:1);然后現在我們再來解決一次上面同樣的問題:
?比如求一到六節點最短路徑:
% 構造鄰接矩陣 a = zeros(6); a = sparse([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],[41 99 51 32 15 45 38 32 36 29 21]) a = a + a'; a(a==0) = inf; % 零元素換成inf a(eye(6,6)==1)=0; % 對角線換成 0 view(biograph(a,[],'ShowWeights','on')) [min,path]=dijkstra(a,1,6) % dijkstra模型求解節點一到節點六最短路徑輸出:
min就是最短路徑為82,路徑過程為:1 5 3 6
同樣是求最短路徑,該方法可能更簡單,你只需要在這里創建一個矩陣,可以求任意兩個節點的最短距離和路徑。請領悟一下,在你的博客寫好記錄。
2.1.4 無向圖最短路徑(1)
還是求解這個問題:
?我們先用上面的第一種方法求:
clear all clc W = [41 99 51 32 15 45 38 32 36 29 21]; G = sparse([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],W) UG = tril(G + G') view(biograph(UG,[],'ShowArrows','off','ShowWeights','on'))輸出:
?然后添加一行代碼,使用求函數graphallshortestpaths(注意這個函數2021版本被棄用):
clear all clc W = [41 99 51 32 15 45 38 32 36 29 21]; G = sparse([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],W); UG = tril(G + G') view(biograph(UG,[],'ShowArrows','off','ShowWeights','on')) graphallshortestpaths(UG,'directed',false)輸出:
我們可以一樣就看出節點一到節點六最短距離82.
用我上面的講過的方法,可以看出路徑為:1-5-3-6
21+32+29=53+29=82
2.1.5無向圖最短路徑(2)
其實我們可以使用函數shortestpath求解,更方便:
clc clear all % 構造鄰接矩陣 G = zeros(6); G = graph([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],[41 99 51 32 15 45 38 32 36 29 21])plot(G,'EdgeLabel',G.Edges.Weight) [P,d] = shortestpath(G,1,6)輸出:
p就是路徑,d就是最短距離,更方便了!
總結
以上是生活随笔為你收集整理的最短路径和距离及可视化——matlab的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php动态页面加载慢,通过动态加载JS文
- 下一篇: python入门:Anaconda和Ju