数学建模社区-数学中国

标题: 图中最短路径解决方法 Dijkstra [打印本页]

作者: 2744557306    时间: 2023-12-22 11:02
标题: 图中最短路径解决方法 Dijkstra
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:
! E7 t% P, ]& K" [- aclear all2 _" n  Z& t  u- K1 Q* D: `4 _
%图论最短路问题的Dijkstra算法
' u! p) F, a% p1 p7 }%邻接矩阵(点与点的关系)
3 _. a) }' C7 ~/ u1 Y  zw=[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 nn=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; Fk=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! m2.邻接矩阵: 图被表示为邻接矩阵 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 h4.主循环: 使用 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

913 Bytes, 下载次数: 0, 下载积分: 体力 -2 点

售价: 1 点体力  [记录]  [购买]






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5