最短路径和距离及可视化——matlab
文章目錄
一、前言
二、最短路線
2.1 教程
2.1.1 sparse創(chuàng)建稀疏矩陣
2.1.2 有向圖最短路徑(1)
2.1.3 有向圖最短路徑(2)
2.1.4 無(wú)向圖最短路徑(1)
2.1.5無(wú)向圖最短路徑(2)
一、前言
動(dòng)態(tài)規(guī)劃是求解某類問(wèn)題的一種方法,是考察問(wèn)題的一種途徑,而不是一種特殊算法(如線性規(guī)劃是一種算法)。因而,它不象線性規(guī)劃那樣有一個(gè)標(biāo)準(zhǔn)的數(shù)學(xué)表達(dá)式和明確定義的一組規(guī)則,而必須對(duì)具體問(wèn)題進(jìn)行具體分析處理。因此,在學(xué)習(xí)時(shí),除了要對(duì)基本概念和方法正確理解外,應(yīng)以豐富的想象力去建立模型,用創(chuàng)造性的技巧去求解。
二、最短路線
2.1 教程
2.1.1 sparse創(chuàng)建稀疏矩陣
比如我們有這樣的無(wú)向圖:
?代碼:
%w(起點(diǎn),終點(diǎn))=權(quán)重值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)運(yùn)行結(jié)果:
?或者這樣創(chuàng)建稀疏矩陣:
clear all clc %sparse([起點(diǎn)集合],[對(duì)應(yīng)終點(diǎn)集合],[對(duì)應(yīng)權(quán)重集合]) G = sparse([1 1 1 2 2],[2 3 4 3 4],[2 3 8 6 6]); s=sparse(G)運(yùn)行結(jié)果:? 可以看出與上面一樣
2.1.2 有向圖最短路徑(1)
使用函數(shù):graphallshortestpaths,其語(yǔ)法如下:
參數(shù)含義:
G:稀疏矩陣
0/false代表無(wú)向圖 1/true代表有向圖。默認(rèn)為true。
我們要解決如下問(wèn)題:
首先創(chuàng)建一個(gè)有向圖:
代碼:
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'))運(yùn)行結(jié)果:
?第二步:找出有向圖中每對(duì)節(jié)點(diǎn)之間的所有最短路徑。
使用graphallshortestpaths函數(shù),只需要加一行代碼即可:
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)運(yùn)行結(jié)果:
?那返回的結(jié)果什么意思呢?
比如說(shuō)第一行代表的意思就是節(jié)點(diǎn)一分別到節(jié)點(diǎn)六的距離。為什么第一個(gè)值為0?節(jié)點(diǎn)一到節(jié)點(diǎn)一當(dāng)然在原位置了,肯定為0咯。第二行類似一樣的道理。
因此:從節(jié)點(diǎn)一到節(jié)點(diǎn)六最短距離為多少呢?最短距離為95可以從返回表中一眼看出來(lái)。留個(gè)問(wèn)題:節(jié)點(diǎn)二到節(jié)點(diǎn)一位111怎么得到的?路徑位?
根據(jù)結(jié)果推路徑:
第一行推出:節(jié)點(diǎn)一先到節(jié)點(diǎn)五,此時(shí)距離為21(為么選節(jié)點(diǎn)五?因?yàn)楣?jié)點(diǎn)一到節(jié)點(diǎn)五最短,每次都選擇最短)
然后我們?cè)偬降谖逍?#xff1a;節(jié)點(diǎn)五要先到節(jié)點(diǎn)四,距離為36?
于是我們?cè)偬降谒男?#xff1a;節(jié)點(diǎn)四要先到節(jié)點(diǎn)六,距離為38
?此時(shí)我們已經(jīng)完成節(jié)點(diǎn)一到節(jié)點(diǎn)六距離為:
21+36+38=95
路徑為:1—5—4—6
下面我在介紹一個(gè)新的方法,會(huì)更簡(jiǎn)單!
2.1.3 有向圖最短路徑(2)
保存該函數(shù):dijkstra.m(你不需要修改,知道這個(gè)函數(shù)具體意思,我們調(diào)用它就行)
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);然后現(xiàn)在我們?cè)賮?lái)解決一次上面同樣的問(wèn)題:
?比如求一到六節(jié)點(diǎn)最短路徑:
% 構(gòu)造鄰接矩陣 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; % 零元素?fù)Q成inf a(eye(6,6)==1)=0; % 對(duì)角線換成 0 view(biograph(a,[],'ShowWeights','on')) [min,path]=dijkstra(a,1,6) % dijkstra模型求解節(jié)點(diǎn)一到節(jié)點(diǎn)六最短路徑輸出:
min就是最短路徑為82,路徑過(guò)程為:1 5 3 6
同樣是求最短路徑,該方法可能更簡(jiǎn)單,你只需要在這里創(chuàng)建一個(gè)矩陣,可以求任意兩個(gè)節(jié)點(diǎn)的最短距離和路徑。請(qǐng)領(lǐng)悟一下,在你的博客寫好記錄。
2.1.4 無(wú)向圖最短路徑(1)
還是求解這個(gè)問(wèn)題:
?我們先用上面的第一種方法求:
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'))輸出:
?然后添加一行代碼,使用求函數(shù)graphallshortestpaths(注意這個(gè)函數(shù)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)輸出:
我們可以一樣就看出節(jié)點(diǎn)一到節(jié)點(diǎn)六最短距離82.
用我上面的講過(guò)的方法,可以看出路徑為:1-5-3-6
21+32+29=53+29=82
2.1.5無(wú)向圖最短路徑(2)
其實(shí)我們可以使用函數(shù)shortestpath求解,更方便:
clc clear all % 構(gòu)造鄰接矩陣 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就是最短距離,更方便了!
總結(jié)
以上是生活随笔為你收集整理的最短路径和距离及可视化——matlab的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php动态页面加载慢,通过动态加载JS文
- 下一篇: matlab设置工作路径