QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 25894|回复: 61
打印 上一主题 下一主题

迪克斯特拉算法

[复制链接]
字体大小: 正常 放大

1

主题

3

听众

42

积分

升级  38.95%

该用户从未签到

自我介绍
我是一个数模的喜爱者

群组matlab共享与进阶

群组MATLAB讨论交流群

群组MATLAB

群组Matlab讨论组

跳转到指定楼层
1#
发表于 2010-8-6 22:23 |只看该作者 |正序浏览
|招呼Ta 关注Ta
%最短路问题(迪克斯特拉算法)% Z9 q/ D* ]# x& x* w! C
clear;
: X- \; N% G" z6 g" F* Hclc;
- V& e: c& n! X, d; m1 L, q3 RM=10000;
5 ?- d6 A: ^* Fa(1,:)=[0,50,M,40,25,10];
; t- F( c' G1 ~8 Za(2,:)=[zeros(1,2),15,20,M,25];
( ~: V2 G: O* X  Qa(3,:)=[zeros(1,3),10,20,M];) x0 ^4 s6 t  r
a(4,:)=[zeros(1,4),10,25];
1 D' ~/ U' Q0 n% \* j% ia(5,:)=[zeros(1,5),55];( E1 M. I. P8 [8 ?' d# _7 X
a(6,:)=zeros(1,6);& F; d. N' e& ?. T+ e
a=a+a';" }$ e! p! @; k- h% l. s. _5 C
%length函数返回的是矩阵中行数和列数中较大的长度
; x) X: {2 K  u; ?9 Lpb(1:length(a))=0;%生成一个一行多列的0矩阵
! Y! g& z+ g( o! Lpb(1)=1; %第一个数赋值为1; Y/ @6 X% M- G- Q
index1=1;
7 g4 I! h+ [) C% B0 P* P- l8 qindex2=ones(1,length(a));%生成一个一行多列的1矩阵( P3 B3 a7 H" T# B& i9 a
d(1:length(a))=M; d(1)=0; temp=1;
) x9 g0 E9 C/ w; [%sum函数为各行之和
5 F+ b" w4 G7 a/ V' X: A5 N5 ewhile sum(pb)<length(a)
  f3 C3 A) C" Z, E5 @  tb=find(pb==0);%find函数返回的是pb矩阵中数值为0的坐标(2,3,4,5,6....)
2 u0 E2 G/ K8 K  g5 I- u1 G  d(tb)=min(d(tb),d(temp)+a(temp,tb));" |' _0 t4 t) ?9 y7 ~" t- a0 l+ y: c
  tmpb=find(d(tb)==min(d(tb)));
1 q: }* A" H  K/ S  temp=tb(tmpb(1));% j) l" K8 j( b
  pb(temp)=1;, r, m6 J5 C, U6 G% n/ X( E3 A
  index1=[index1,temp];# V! U; Q! |9 J. w1 j
  index=index1(find(d(index1)==d(temp)-a(temp,index1)));2 F# i; Z) f/ i" u# |( i, Y$ l; V
  if length(index)>=23 S* V6 H* M9 y' h& L, f
    index=index(1);
2 t, @" X- x, \% B0 j  end4 G' n( s4 D3 W. ]  ]  n; a
  index2(temp)=index;
6 v: V2 y& ^' wend
2 p+ I* M0 n7 F& t& t- |d,index1,index2) X& \9 K& v7 L* u: t$ [4 I7 K
迪杰斯特拉算法用于求解一个有向图(也可以是无向图,无向图是有向图的一种特例)的一个点(称之为原点)到其余各点(称之为周边点)的最短路径问题。算法构思很是巧妙(我这么认为),简直达到了“无心插柳柳成荫”的境界。算法本身并不是按照我们的思维习惯——求解从原点到第一个点的最短路径,再到第二个点的最短路径,直至最后求解完成到第n个点的最短路径,而是求解从原点出发的各有向路径的从小到大的排列(如果这个有向图中有环1-2-3-1算法岂不是永无终结之日了??!!),但是算法最终确实得到了从原点到图中其余各点的最短路径,可以说这是个副产品,对于算法的终结条件也应该以求得了原点到图中其余各点的最短路径为宜。清楚了算法的这种巧妙构思后,理解算法本身就不是难题了。
2 X; H% y/ H% {2 ?8 x. O9 u3 K       算法把一个图(G)中的点划分成了若干部分:
, J& o: S  k9 o; _: J7 X* q( p       1):原点(v);( B6 _8 J  y& X5 ]  F
       2):所有周边点(C);+ c( ]9 V/ A! u* h- N
       另外有一个辅助集合S,从v到S中的点的最短路径已经求得。S的最初状态是空集。
) g* D8 y4 g* L. L       这样就可以进一步划分图(G):
# B/ q% q4 t5 h0 l/ y. A       1):原点(v);' @6 @5 t# ]" ~
       2):已求出v至其最短路径的周边点(S);
( T$ F  q  D  m4 [. `: b" H       3):尚未求出v至其最短路径的周边点(Other=C-S);7 A7 H! H# w2 R2 T( k2 d; v
       算法的主体思想:
& \, t4 Z0 I; h* b, k' q           A、找到v——Other所有路径中的的最短路径vd=v——d(Other的一个元素);! x% a" E  Y; K$ c3 p
B、找到v——S——Other所有路径中的的最短路径vi=v——i(Other的一个元素);
5 ^! W4 S. A, L* p4 w0 S% mC、比较vd和vi如果vd<=vi则将d加入S且从Other中删除,否则将i加入S且从Other中删除。
, y3 t9 w# C) O6 O  k, C0 z# U/ T重复以上步骤直至Other为空集。9 A8 g: [5 n" |/ ?3 ~0 U  ?" V/ ^
$ t6 J3 |/ N9 \
我们求得的最短路径是升序排列的,那为什么下一条最短路径就存在于v——
- t8 [) D) [$ e+ K; S$ L
, D- d) k' j3 _
zan
转播转播0 分享淘帖0 分享分享1 收藏收藏0 支持支持1 反对反对0 微信微信
yi_lip        

0

主题

0

听众

4

积分

升级  80%

该用户从未签到

自我介绍
喜欢编程
回复

使用道具 举报

623976603        

0

主题

4

听众

257

积分

升级  78.5%

  • TA的每日心情
    开心
    2014-9-15 14:33
  • 签到天数: 109 天

    [LV.6]常住居民II

    回复

    使用道具 举报

    sqirrel        

    0

    主题

    7

    听众

    21

    积分

    升级  16.84%

  • TA的每日心情
    无聊
    2013-6-8 18:10
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    自我介绍
    haoxi

    群组学术交流A

    群组学术交流B

    回复

    使用道具 举报

    4

    主题

    4

    听众

    156

    积分

    升级  28%

  • TA的每日心情
    郁闷
    2014-3-24 10:09
  • 签到天数: 41 天

    [LV.5]常住居民I

    群组学术交流B

    回复

    使用道具 举报

    Paul_Sing 实名认证       

    0

    主题

    4

    听众

    43

    积分

    升级  40%

  • TA的每日心情
    开心
    2014-10-14 13:54
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    自我介绍
    软件工程硕士
    回复

    使用道具 举报

    WenqiSun        

    0

    主题

    0

    听众

    2

    积分

    升级  40%

    该用户从未签到

    回复

    使用道具 举报

    0

    主题

    4

    听众

    63

    积分

    升级  61.05%

  • TA的每日心情
    开心
    2012-1-17 12:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    回复

    使用道具 举报

    alair002        
    头像被屏蔽

    1

    主题

    4

    听众

    328

    积分

    升级  9.33%

  • TA的每日心情
    擦汗
    2012-2-6 07:40
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    提示: 作者被禁止或删除 内容自动屏蔽
    回复

    使用道具 举报

    tanai        

    0

    主题

    4

    听众

    8

    积分

    升级  3.16%

  • TA的每日心情
    开心
    2011-10-24 15:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-12 22:02 , Processed in 0.732532 second(s), 102 queries .

    回顶部