数学建模社区-数学中国
标题:
图中最短路径解决方法 Dijkstra
[打印本页]
作者:
2744557306
时间:
2023-12-22 11:02
标题:
图中最短路径解决方法 Dijkstra
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:
! E7 t% P, ]& K" [- a
clear all
2 _" n Z& t u- K1 Q* D: `4 _
%图论最短路问题的Dijkstra算法
' u! p) F, a% p1 p7 }
%邻接矩阵(点与点的关系)
3 _. a) }' C7 ~/ u1 Y z
w=[0,2,4,inf,inf,inf,inf;
% M3 B$ {1 F# u
2,0,inf,3,3,1,inf;
/ q% T6 ?' U% A4 ]; j0 @
4,inf,0,2,3,1,inf;
. n2 D4 p- `. ~6 M8 X
inf,3,2,0,inf,inf,1;
- J1 D+ W; k* x6 F) }8 i4 A
inf,3,3,inf,0,inf,3;
. Z0 Q! k5 k; f; I. A5 R( R% T
inf,1,1,inf,inf,0,4;
* A/ y2 H5 H! D8 V: w$ e
inf,inf,inf,1,3,4,0];
W+ ]) A# Z! H5 p% i2 n
n=size(w,1);%记录图中点数
' ~' J+ L/ Y- _- d8 m' A0 a
) n0 [% F- x) }( D2 ?
for i=1:n
( O7 @" J" j. p" p9 A# L3 A1 w
l(i)=w(1,i); %为l(v)赋初值
) t8 C# t7 \6 J% O
z(i)=1; %为z(v)赋初值1
4 c: o9 `2 d8 ?
end
) r5 g% F3 d1 J) S
2 h( D3 ^0 G! `) g; b3 D& X9 h$ n4 X
s=[]; %s集合
* ]4 i% f/ V2 T) y3 T
s(1)=1; %s集合的第1个元素为起点
/ Z/ G1 D. \5 Y7 _% Y5 l7 {
u=s(1);
5 C2 R; v: H. O" _6 M; R; F
k=1; %k记录集合s中点的数量
" y* j4 e+ [" `6 L8 ~ k
8 e' \1 n) @1 C+ M
while k<n %当集合s未包含所有元素的时候执行循环
) h/ O# T* a4 h$ C/ X1 @
for i=1:n %更新一遍l(v),z(v)
9 r+ M \; E- u* `% P8 Y
if l(i)>l(u)+w(u,i)
6 d' b ^3 W: \
l(i)=l(u)+w(u,i);
4 _, c. d5 }7 A: f
z(i)=u;
: r5 z {8 [% f# Z0 ^# B9 i
end
: A5 j& K$ P; r: X4 I* }
end
1 O* W3 O' ~2 M- v) w6 c
- b3 y2 G7 Q$ s, J
%找l(i)中最小的v加入s集合
" i. n& _: h- T0 V: V& N+ e
ll=l;
( g1 u5 V+ [- w: S' ~# ~
for i=1:n
4 ]3 @" V( k; l r' f
for j=1:k
) _8 B. v; ^2 W" _$ {
if i==s(j)
$ [" o, i D2 N% p! _% T+ ]
ll(i)=inf; %去除掉已经在s集合中的点
* H: i/ E# x, {
end
4 x* u& |' l" C& P
end
$ p% L# _: a! b: Z8 d/ B2 X2 p
end
5 V |/ E$ h( \7 A
[lv,v]=min(ll); %求最小的l(v)
4 \) v' F! w$ O q. ]3 ?: v
s(k+1)=v; %加入集合s
+ W% N# e( A# t5 p1 j0 O
u=v;
+ X9 [2 z( Z+ I0 t
k=k+1;
9 F7 S$ L3 k" I2 R- E/ ^
end
9 u8 @+ w: x5 t2 q0 {3 N0 Q7 O
# o5 J8 ]' k2 Z8 m
fprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)
6 c1 W: _+ O6 [% \' Q( } K6 `( ]
$ ]. b. }: b" Q1 W/ p& N; {
解释:
! g# U- m2 w: V# U
0 W! h0 Q) {, y7 C( [ Z, b! w5 \
1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。
* K5 v' D0 v* A! m
2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。
9 i, i% y* X2 h. L( G: l; Y4 d+ H! D
3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。
8 ?' k5 p) @; l& }5 h
4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。
: A3 B% V! w2 n5 |
5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。
% u$ x: @6 q; N( F
$ }: N5 q' K- v7 O* L
注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。
: I1 n6 S& [8 P# S: }2 s5 w: d
; y' B6 w, K9 \( M) Z. R
" F0 R& }& v$ X3 l3 Y- C+ l2 O
Dijkstra.m
2023-12-22 11:01 上传
点击文件名下载附件
下载积分: 体力 -2 点
913 Bytes, 下载次数: 0, 下载积分: 体力 -2 点
售价:
1 点体力
[
记录
] [
购买
]
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5