数学建模社区-数学中国

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

作者: 2744557306    时间: 2023-12-22 11:02
标题: 图中最短路径解决方法 Dijkstra
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:8 M, T1 a( T9 L9 h% R0 R
clear all" l5 K' H8 @. k5 g5 P
%图论最短路问题的Dijkstra算法1 D" b+ c% b8 ^4 b' e( q  o
%邻接矩阵(点与点的关系)
" _% u; g# [% Sw=[0,2,4,inf,inf,inf,inf;  
( h: O3 Q$ P* c; S4 }; m3 E! Q   2,0,inf,3,3,1,inf;/ l( P' {4 g" J2 g+ d5 B
   4,inf,0,2,3,1,inf;                     
2 l8 l( H: z4 W( o0 s' }   inf,3,2,0,inf,inf,1;                    % S7 _8 z' i% L; h
   inf,3,3,inf,0,inf,3;
9 z* X5 H* @& c+ y2 M) l   inf,1,1,inf,inf,0,4;
4 ^8 v! q- U/ p, u   inf,inf,inf,1,3,4,0];
9 ^/ o/ c0 D+ wn=size(w,1);%记录图中点数! C& h  O$ b' a6 H" N7 c) r  \$ {
! m3 ~  B# @* j
for i=1:n8 }, l& b$ M* Y$ \' }7 u
    l(i)=w(1,i); %为l(v)赋初值+ ^/ _( R0 P, }
    z(i)=1;      %为z(v)赋初值1
/ {7 w; I- J+ `: E9 c% eend
1 u. e7 B* X9 M1 c0 I0 V' H; w& r4 D8 Y! M+ Y5 O2 z) y
s=[];            %s集合* f: r3 ?8 ?" R7 T  T9 t& {( {
s(1)=1;          %s集合的第1个元素为起点
' A3 t6 q, ]0 `9 j! ~u=s(1);) b8 k; O1 ^: `  ~- k
k=1;             %k记录集合s中点的数量
9 s# X) Q) ^0 D3 ~+ M3 B$ Z! y, y! C/ L  a4 Q
while k<n       %当集合s未包含所有元素的时候执行循环
3 N" M# h; w8 \9 v    for i=1:n    %更新一遍l(v),z(v)
; H( M! N- N! `7 R- t3 O! u+ V        if l(i)>l(u)+w(u,i)( l" J0 V: N  v5 Y! Q* h$ f' B
            l(i)=l(u)+w(u,i);
! i) w" h: o. v- O) Q% _1 g2 p3 o/ R            z(i)=u;6 ~! @* K1 |' p& ?
        end4 D" h1 ?6 C  D+ c( m
    end& L* C" c4 P4 l& X, k$ e) V

* ^( R: r3 J1 x2 ]8 V, ?    %找l(i)中最小的v加入s集合; `+ j2 `$ v3 T# }: {' H
    ll=l;8 N+ p  `2 _) i, d* q- R. G+ y' n
    for i=1:n% O( N6 n, C5 d' `+ w$ o9 ]
        for j=1:k
: X6 ~: e$ b' U  A            if i==s(j)
1 }' j+ p, \+ |) }8 ~                ll(i)=inf; %去除掉已经在s集合中的点
- ]* W9 s5 e$ `! w            end   G6 d& N+ D: u' o$ P
        end! X4 F. i/ y* J4 `  \3 V( V2 T; m; k
    end+ I. T& i1 `5 l. z/ P
    [lv,v]=min(ll); %求最小的l(v)
5 p; j- ^# x  u8 v    s(k+1)=v;       %加入集合s
/ ?4 v# x8 y/ X" w/ C8 _    u=v;
3 B' E, A# l6 s4 c    k=k+1;
9 K- ]: X! Z; J' _5 oend
2 M  N5 G, i2 s6 c+ ^' a
5 i6 o$ ?) x" V( E# efprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)
8 J9 b, ?* Q1 o
% B! ^9 r5 G* W  k6 [1 r解释:
9 O- |( ?+ C/ S4 X. ~8 ^& |+ K% O- }$ `
1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。- B% P( x" H$ a6 o) }# }- x* e
2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。- s" z# h$ A1 y! S/ Y9 W! B0 W
3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。
  z" Z" W% x0 Z( K/ {- u4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。
6 D; \; Q3 {5 S4 K5 \. u# Q5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。1 k. z! `1 B- _' q5 I: y

6 G! i9 ]# Z; P: P# C# p( V5 Q. c注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。$ L3 t$ y4 x( I. X8 N
  y- e$ Q8 v- j7 i+ ^6 t" B6 ~

2 C. A! u2 [  \

Dijkstra.m

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

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






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