数学建模社区-数学中国
标题:
图中最短路径解决方法 Dijkstra
[打印本页]
作者:
2744557306
时间:
2023-12-22 11:02
标题:
图中最短路径解决方法 Dijkstra
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:
5 N- D0 y% b6 c+ C
clear all
. B. k, d" ^, \+ W% M( z& k( ~
%图论最短路问题的Dijkstra算法
* a% O) I0 k( g4 D6 q" j
%邻接矩阵(点与点的关系)
) q# S3 X& {- e8 F5 O4 P4 [4 o
w=[0,2,4,inf,inf,inf,inf;
, W G7 D0 V5 N& A0 y' g
2,0,inf,3,3,1,inf;
2 B; c3 ?5 E9 O" N S7 x# H
4,inf,0,2,3,1,inf;
! _3 F# G5 |# s# E* `/ T
inf,3,2,0,inf,inf,1;
/ k9 c" n" p4 O( u% Y( e8 z9 u: M7 g4 k
inf,3,3,inf,0,inf,3;
: C# z7 u' H$ m1 V
inf,1,1,inf,inf,0,4;
7 T4 c( K1 ~/ M6 K F/ B/ x' J
inf,inf,inf,1,3,4,0];
/ i) u4 Y/ p& k+ L
n=size(w,1);%记录图中点数
( F5 |+ m2 N6 f
# M# W$ ^+ v9 y/ v" q& B
for i=1:n
$ s0 C" t* a. `5 Z$ z
l(i)=w(1,i); %为l(v)赋初值
7 L7 N& r4 Y) v( Q4 o( r
z(i)=1; %为z(v)赋初值1
0 U2 s) M1 b4 A- e' y$ ?
end
! @- U, \. [' \1 J
& w- I" t7 d2 ]( h: b6 H
s=[]; %s集合
. m' V/ j$ }9 C$ u
s(1)=1; %s集合的第1个元素为起点
! {4 O# D, Q4 O: @/ I# J7 W' A
u=s(1);
1 F5 V N# {# e. n; S
k=1; %k记录集合s中点的数量
' M5 j8 i9 g7 n, ]" u6 \6 ]0 Q
6 i. x3 q; n) ^! p9 `
while k<n %当集合s未包含所有元素的时候执行循环
- y H5 J& b& P& @8 I( |7 t" N6 g
for i=1:n %更新一遍l(v),z(v)
5 U% {4 O1 V' Q6 N5 M- h
if l(i)>l(u)+w(u,i)
4 b5 J* q" n$ U" m: l5 c2 y+ }
l(i)=l(u)+w(u,i);
# ?- _2 E$ ?/ ?) u' [' x
z(i)=u;
& y9 }4 V: x; z1 m
end
! p: d o6 c; E$ o+ A9 A( r! I! {
end
3 l1 w! D' b7 L* e9 i/ f
* D8 k1 |) N1 d. \) N2 J7 G3 u
%找l(i)中最小的v加入s集合
/ Y/ w+ m: C1 i. Q' i. c
ll=l;
$ A0 x: T& h9 z: Y' |
for i=1:n
5 N; h9 i+ K9 k1 U4 i$ \
for j=1:k
2 ]& P2 J5 |$ u4 j
if i==s(j)
+ a6 n8 d. e8 x8 o+ L
ll(i)=inf; %去除掉已经在s集合中的点
# f7 V8 B. b, W8 b( }& g, M
end
6 E% k, |$ E4 J6 s1 Q" `6 O" L
end
) ]2 s( J; n# H& C6 z2 {9 A
end
9 N) E; B" H0 C$ _9 g" t
[lv,v]=min(ll); %求最小的l(v)
( O: K. M* R0 y* n
s(k+1)=v; %加入集合s
, z; L1 a1 w# [
u=v;
2 f* e; u3 [5 s" M! q( }8 Q! g! x
k=k+1;
( u8 }+ |' [3 f3 M/ M7 G
end
# R8 d" M) E) s
$ @+ U& p9 K5 x8 k& z# J
fprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)
0 c) Q. i4 o0 T1 G+ y
: S/ X& o$ p/ \# W9 S6 V
解释:
9 i4 {" J9 X& l0 z* O9 I* W
& f2 K z6 m) m# x
1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。
. E/ G, S9 [1 P7 b9 N- t
2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。
2 X7 L- m* H8 s9 `$ E/ K" a2 S
3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。
2 M, h. b( U9 c9 V/ {
4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。
h, }1 o: H/ m. W$ Z8 s
5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。
3 m& r0 a( f9 x. N2 A a) f0 l w9 k* b
; W7 r, w; {* H
注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。
V: T0 Q- q, V) i* B6 d8 R# H
& T, w" }+ J! |3 |
! w7 L$ j" T- x* H6 c5 o/ g# E
Dijkstra.m
2023-12-22 11:01 上传
点击文件名下载附件
下载积分: 体力 -2 点
913 Bytes, 下载次数: 0, 下载积分: 体力 -2 点
售价:
1 点体力
[
记录
] [
购买
]
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5