数学建模社区-数学中国

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

作者: 2744557306    时间: 2023-12-22 11:02
标题: 图中最短路径解决方法 Dijkstra
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:8 ]! A4 ]" w+ d: \0 \' d( C
clear all
* Z3 N1 k( f, A7 R  M%图论最短路问题的Dijkstra算法
0 F- G: o4 l1 b8 H6 U%邻接矩阵(点与点的关系)
# t) d  Y! _/ W& D7 ow=[0,2,4,inf,inf,inf,inf;  
/ v1 W1 {7 }$ b# a   2,0,inf,3,3,1,inf;
  V& ?3 d- h6 x% F, m1 [, O7 m) z1 Q   4,inf,0,2,3,1,inf;                     
! y# d$ ]- r2 Q( a# M2 W1 {. j0 h7 K   inf,3,2,0,inf,inf,1;                    4 @& I, a' c& G% @: x
   inf,3,3,inf,0,inf,3;
2 _/ j. C$ D6 m7 C4 @( ^   inf,1,1,inf,inf,0,4;
0 J; @) V2 S# |6 y   inf,inf,inf,1,3,4,0];/ N+ @- @* w* n& S* u( Z  s
n=size(w,1);%记录图中点数; d3 V3 ^4 D( J

2 h+ c/ ]7 r: \4 Q( xfor i=1:n
/ f2 d5 U( R' b5 i7 E: J    l(i)=w(1,i); %为l(v)赋初值- w7 T2 Z+ U6 {% v% j- m9 r( j
    z(i)=1;      %为z(v)赋初值1
/ Q5 p9 V5 {0 S1 @! v+ iend
$ T9 {% K+ w. K- l* w  V: O
& ~+ F, X) t4 n# |' g( V3 M8 gs=[];            %s集合. j) ?. H$ Z" y6 r- }# C
s(1)=1;          %s集合的第1个元素为起点: C: r7 v' d8 F" R
u=s(1);) T5 B/ R% A; U6 |+ F$ U- L1 \6 ?
k=1;             %k记录集合s中点的数量
. D/ O) Z/ t7 x2 F, |9 i$ L3 P; B* Z) n' }: k
while k<n       %当集合s未包含所有元素的时候执行循环
: X) b+ o7 B, h2 D$ \1 e, Z    for i=1:n    %更新一遍l(v),z(v)
0 E& \0 `% k8 m# p* _5 R        if l(i)>l(u)+w(u,i)
# u, h4 g% h, g/ ~6 [. M            l(i)=l(u)+w(u,i);
, T/ w7 W- p% N" i* g& a( S) i. @. \8 `            z(i)=u;
1 k7 N; E( q7 y6 @* {& J) d7 `/ T        end
# u- ^& x3 i* r% y0 a8 ^! s% u    end7 a4 U2 b9 n; m% ^& \
* y$ ]! O' G, V
    %找l(i)中最小的v加入s集合
# I# v" q0 n0 p! C+ c( h4 m$ i    ll=l;7 B* ?/ N1 \" a: m* o, R$ i
    for i=1:n) x& ^& S: l( L0 o1 Q
        for j=1:k
, H# Q# s8 e0 H, [$ h, B            if i==s(j)
1 U! P- ^7 |4 D" O* k: M+ |                ll(i)=inf; %去除掉已经在s集合中的点& P6 Y7 ]  W$ k% t0 c9 T9 N( d- W
            end
5 T$ T# t- J& o9 s+ t9 r        end* \$ H# U, ?8 D' W0 R: e9 h
    end
. U' H8 I  K/ j    [lv,v]=min(ll); %求最小的l(v)) ?" f( M% i! S0 R
    s(k+1)=v;       %加入集合s3 n1 Z, O8 b6 `& e/ Q
    u=v;
+ X$ n/ `/ W4 N    k=k+1;
( t4 g' z6 ^" P$ V9 _  D) vend1 G6 W$ e; r5 _2 S' o
: K, p1 W$ X4 D9 o0 i) N) N( e
fprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)
' ^- T# A* A" x$ I/ j: F( p& Z3 W( t3 M& |6 U, q
解释:
+ |" X0 U  h4 K5 l) K0 Q$ ?. s8 m8 F9 y+ {, G- d
1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。) t- w: R2 i$ {- i
2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。
" R6 p% z5 o7 w+ v% Q3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。  h; M! [. S7 A8 i. t/ Q) g
4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。; ~$ x1 P  P2 p
5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。( V* q5 V1 a% |* k3 l6 T4 w: X

. [. w9 o/ Y# o) h3 N4 y! h7 M1 `注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。, H4 d4 h, I% B! J' C3 }  P
1 c6 @$ a  k% q. a
8 p0 i$ {0 V) d( E

Dijkstra.m

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

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






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