最近在搞數學建模,這個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)
都比它大,它不可能再通過其他中轉結點到達這點的距離比這還小),更新u
、p
,回到第三步,直至所有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...