QQ登录

只需要一步,快速开始

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

迪克斯特拉算法

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

1

主题

3

听众

42

积分

升级  38.95%

该用户从未签到

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

群组matlab共享与进阶

群组MATLAB讨论交流群

群组MATLAB

群组Matlab讨论组

跳转到指定楼层
1#
发表于 2010-8-6 22:23 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
%最短路问题(迪克斯特拉算法)
9 J; O5 d6 ]$ g5 t3 ^& Z+ C9 X( Cclear;7 y) ], o- S0 M/ K0 v1 f& C
clc;
5 `' f4 a6 m& T1 h8 f7 l3 mM=10000;! Q" \0 \0 g0 }6 d4 y4 A
a(1,:)=[0,50,M,40,25,10];
1 Z  \; A0 T" s1 \! S: r. ka(2,:)=[zeros(1,2),15,20,M,25];8 t6 ]/ W# V4 q7 S
a(3,:)=[zeros(1,3),10,20,M];% x: _) B6 B$ u! E$ |
a(4,:)=[zeros(1,4),10,25];
4 R9 M( u. A# k: qa(5,:)=[zeros(1,5),55];
0 L' T3 e, T4 ^a(6,:)=zeros(1,6);
5 @, G  p7 c! Ia=a+a';0 \' d4 C' `( q- W
%length函数返回的是矩阵中行数和列数中较大的长度
5 z) M$ c; x' e0 ^$ S" a! Y  u* Spb(1:length(a))=0;%生成一个一行多列的0矩阵
, s) I: q8 X1 @6 |1 _% ^pb(1)=1; %第一个数赋值为1
4 Z; X, Q" D  R! O0 e, kindex1=1;' v. y/ s# p* q1 E7 @$ K1 b. H
index2=ones(1,length(a));%生成一个一行多列的1矩阵
" Q; w- {/ C* L) e9 i% cd(1:length(a))=M; d(1)=0; temp=1;% D, k) T" O" |
%sum函数为各行之和- ^( ?, Z" v( o* I# Z) N# A8 {1 v' F* f
while sum(pb)<length(a)3 Z9 U: n3 M" \
  tb=find(pb==0);%find函数返回的是pb矩阵中数值为0的坐标(2,3,4,5,6....)# X# Q9 o& P7 G( z1 j
  d(tb)=min(d(tb),d(temp)+a(temp,tb));9 v! \9 ?) J% k$ I
  tmpb=find(d(tb)==min(d(tb)));
" K8 E3 T: b4 ?1 o; P2 |  temp=tb(tmpb(1));* L% g( o. _; h- Y. m2 U
  pb(temp)=1;. u! E# ^; [) ]' M: {! G$ a
  index1=[index1,temp];% }9 H& D0 f1 Q% E9 C) w
  index=index1(find(d(index1)==d(temp)-a(temp,index1)));
- U& T% x) I% {) p' o/ E  if length(index)>=2: G" q, b( |6 m: O) ?: e
    index=index(1);  ~$ n% }+ f9 [9 i( u- e+ v/ U
  end
+ J$ }+ }/ p* q! L  index2(temp)=index;1 }6 }. f: Q/ C
end
: J# k/ S2 ^& `d,index1,index2# a) v# h" ~7 G& N8 @! v* l
迪杰斯特拉算法用于求解一个有向图(也可以是无向图,无向图是有向图的一种特例)的一个点(称之为原点)到其余各点(称之为周边点)的最短路径问题。算法构思很是巧妙(我这么认为),简直达到了“无心插柳柳成荫”的境界。算法本身并不是按照我们的思维习惯——求解从原点到第一个点的最短路径,再到第二个点的最短路径,直至最后求解完成到第n个点的最短路径,而是求解从原点出发的各有向路径的从小到大的排列(如果这个有向图中有环1-2-3-1算法岂不是永无终结之日了??!!),但是算法最终确实得到了从原点到图中其余各点的最短路径,可以说这是个副产品,对于算法的终结条件也应该以求得了原点到图中其余各点的最短路径为宜。清楚了算法的这种巧妙构思后,理解算法本身就不是难题了。$ ^* S+ M* s" o. i, u0 r
       算法把一个图(G)中的点划分成了若干部分:- {$ H0 l- [8 H
       1):原点(v);7 A2 @& F0 n% r( s
       2):所有周边点(C);
& h6 H" `* O! j) T8 z3 b       另外有一个辅助集合S,从v到S中的点的最短路径已经求得。S的最初状态是空集。* U: K3 F. }, x6 ^& E
       这样就可以进一步划分图(G):
- ?% T/ ?+ w) w2 Q: b7 W3 B( r       1):原点(v);
* p8 y2 c, F0 N0 }7 u9 i       2):已求出v至其最短路径的周边点(S);8 I' w# i! q# k3 l! M
       3):尚未求出v至其最短路径的周边点(Other=C-S);
1 E% K7 {3 Y/ p' z) m; ~       算法的主体思想:
' }6 N; T8 z2 e3 u2 _* ^/ T& w4 \           A、找到v——Other所有路径中的的最短路径vd=v——d(Other的一个元素);
4 Q$ q. ^; T' z/ T( ^B、找到v——S——Other所有路径中的的最短路径vi=v——i(Other的一个元素);
; Q3 Q+ G% f' zC、比较vd和vi如果vd<=vi则将d加入S且从Other中删除,否则将i加入S且从Other中删除。
; K5 r" H: F; C0 r* i9 x3 k重复以上步骤直至Other为空集。
6 N4 b9 e% N; Y: @4 r! t4 }% Y3 c( g( ?+ d5 g1 G' `. x
我们求得的最短路径是升序排列的,那为什么下一条最短路径就存在于v—— / ]; X. B9 ^3 r" O6 a

/ N; r/ Q  B8 _  R, g1 y
zan
转播转播0 分享淘帖0 分享分享1 收藏收藏0 支持支持1 反对反对0 微信微信
紫辰 实名认证       

12

主题

16

听众

1304

积分

升级  30.4%

  • TA的每日心情
    擦汗
    2013-2-5 09:29
  • 签到天数: 35 天

    [LV.5]常住居民I

    自我介绍
    200 字节以内

    不支持自定义 Discuz! 代码

    群组学术交流A

    群组数学建模保研联盟

    群组Matlab讨论组

    群组湖南大学数学建模

    群组学术交流B

    回复

    使用道具 举报

    linmatsas 实名认证       

    53

    主题

    13

    听众

    3591

    积分

    逍遥游

  • TA的每日心情
    奋斗
    2014-12-2 09:53
  • 签到天数: 54 天

    [LV.5]常住居民I

    自我介绍
    额。。。。世界上最讨厌的事情就是自我介绍。。。

    邮箱绑定达人 新人进步奖 发帖功臣 最具活力勋章

    群组Matlab讨论组

    群组数学建模

    群组小草的客厅

    群组2012数学一考研交流

    群组C 语言讨论组

    回复 紫辰 的帖子" @; S8 f9 K$ ?, n( t: B

    ' s* o! U- Y/ i: a$ z
    4 h# ^* S) k2 p  h4 V8 x# c% s    我是说好像……人家在贴源程序吧…………
    回复

    使用道具 举报

    wajm_011 实名认证       

    3

    主题

    6

    听众

    1163

    积分

    升级  16.3%

  • TA的每日心情
    郁闷
    2012-2-14 03:19
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    自我介绍
    建模,加油加油!!!

    群组数学建摸协会

    群组哈尔滨工业大学建模团

    群组东北三省联盟

    群组Matlab讨论组

    群组数学建模保研联盟

    回复

    使用道具 举报

    salad6        

    0

    主题

    2

    听众

    30

    积分

    升级  26.32%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    queniao        

    0

    主题

    2

    听众

    30

    积分

    升级  26.32%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    snrl        

    0

    主题

    3

    听众

    69

    积分

    升级  67.37%

    该用户从未签到

    新人进步奖

    楼主,你写得实在是太好了。我惟一能做的,就只有把这个帖子顶上去这件事了
    回复

    使用道具 举报

    chshfxfx        

    0

    主题

    2

    听众

    67

    积分

    升级  65.26%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    icm        

    0

    主题

    2

    听众

    70

    积分

    升级  68.42%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    libin1984        

    0

    主题

    2

    听众

    50

    积分

    升级  47.37%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-11 15:38 , Processed in 0.539609 second(s), 108 queries .

    回顶部