matlab中使用dijkstra演算法

2021-10-05 04:10:33 字數 2615 閱讀 1101

最近在搞數學建模,這個dijkstra演算法搞r了好幾天才明白,所以小菜雞來記錄一下。

來講一下大概思路:dijkstr演算法整體是貪心演算法思想

以這個無向圖為例,假設從點1開始:

第一步

建立乙個鄰接矩陣a[nxn],aij表示兩個節點的距離,對角線以及沒有邊的都為無窮大inf

第二步

初始化一些變數

n表示結點的個數

u表示已經找到最短距離的結點下標,初始為1

p表示還未找到最短路徑的結點下標陣列,初始為[2,3,4,5,6]

d表示各點的當前最短距離,最終d裡面存的是各點的最短距離,d(1)=0,其他的都為無窮大inf

v記錄前乙個到達該點的下標,初始都為0

第三步

p中的結點遍歷,對於u(end)結點,(u(end)表示剛找到最短距離的那個結點,初始是1),比較d(u(end))u(end)到該點(p中正在進行遍歷的那點)的距離之和 與 源點到這點的距離(d(該點)),如果前者小,則替換d(該點),並且替換v(該點)u(end)

第四步

p中找到最短的d(p),則該點已找到最短距離,(因為其他的d(p)都比它大,它不可能再通過其他中轉結點到達這點的距離比這還小),更新up,回到第三步,直至所有u的長度等於n

第五步

列印各個節點的最短距離和路徑,路徑遍歷v即可,距離存在d

**實現:

clc,clear

a = inf*

ones(6

);a(

1,[2

,3])

=[1,

2];a

(2,[

3,4,

5])=

[2,7

,5];

a(3,

5)=1

;a(4

,[5,

6])=

[3,2

];a(

5,6)

=6;a=

min(a,a');n=

length

(a);u=1

;% 開始出發的結點下標p=1

:n;% 還未找到最短路徑的結點下標

d=inf*

ones(1

,n);d(

1)=0

;% 各點的當前最短距離

v=zeros(1

,n);

% 記錄前乙個到達該點的下標

while

length

(u)~

= n p=

setdiff

(p,u

(end));

for i=p

if(d

(u(end))+

a(u(end)

,i)<

d(i))d

(i)=d(

u(end))+

a(u(end)

,i);

v(i)=u

(end)

; end

end[tem, i]

=min(d

(p));%

tem是d

(p)中最小的,i是取最小值時p向量的下標

u =[u,p(i

(1))

];endfor i=

setdiff(1

:n,u(1

))disp

("點"+u

(1)+

"到點"

+i+"最短距離為:"+d

(i))

disp

("路徑:"

) j=i;

index=j;

while

v(j)~=

u(1)

j=v(j)

; index=

[j,index]

; end

index=[u

(1),index]

;disp

(index)

end

執行結果:

頭大,好像理解還不是很透啊啊啊

end~

在Matlab中使用Levmar

本文介紹如何在windows平台下,在matlab中適用levmar。首先,網上教程很多,有的需要適用cmake,那樣略顯麻煩。levmar本身提供了對visual studio的支援,並且大部分在windows的開發者都是適用visual studio的,因此本文不使用cmake,而直接利用vis...

Caffe Caffe中使用MATLAB介面

編譯matcaffe ubuntu14.04 編譯matcaffe usr usr caffe sudo make matcaffe j8 mex matlab caffe private caffe cpp 使用 g 編譯。警告 您使用的 gcc 版本為 4.8.4 不支援該版本的 gcc。mex...

在matlab中使用libsvm

上周五開始就嘗試使用libsvm,因為matlab彈出的各種編譯器問題解除安裝2014a,裝上2017b,憂傷地發現還是失敗 目前最新為libsvm 3.22 關於新增路徑 方法一 主頁 設定路徑 選擇windows資料夾即可 方法二 將libsvm 3.22所在資料夾設定為當前路徑 選擇windo...