- 在线时间
- 0 小时
- 最后登录
- 2018-6-6
- 注册时间
- 2018-6-6
- 听众数
- 1
- 收听数
- 1
- 能力
- 0 分
- 体力
- 21 点
- 威望
- 0 点
- 阅读权限
- 20
- 积分
- 14
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 14
- 主题
- 2
- 精华
- 0
- 分享
- 8
- 好友
- 2
升级   9.47% TA的每日心情 | 慵懒 2018-6-6 10:42 |
---|
签到天数: 1 天 [LV.1]初来乍到
 |
最短路问题及其算法
% y- w3 b0 t% \) t) w/ D0 T1 X) `一.实验目的:
" O: _0 s9 V5 ~& O1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;/ Q2 N" }" V* h* m+ m
2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.
' q* ^" K0 w9 v6 e7 q6 X二.实验内容:( i# _4 p+ k* n
要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).
8 c1 l! y1 V7 s为方便计,1km主管道钢管称为1单位钢管.4 X" [) K9 H6 Z6 L5 @
一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:. q0 @. y$ s2 W
( D% C `# M3 J9 N/ x
1 2 3 4 5 6 7: S/ l' `1 W" M& W
9 Y& d; V3 L* V2 I% C
800 800 1000 2000 2000 2000 3000
5 ]1 H. \ O. |$ l9 E/ T+ Z & N/ h' I2 e. A- V5 E. t7 A
160 155 155 160 155 150 160$ k4 a1 C1 k: H$ c" m9 v( @$ H ?" C
' S3 J% t" r" @7 U* m" j1单位钢管的铁路运价如下表:
: u- D% u6 _% \3 B7 a里程(km) 300
2 e3 B0 N+ j. t& c8 ~- h) `301-350 351-400 401-450 451-500* O3 ]7 S' b3 M& P+ O6 O
运价(万元) 20 23 26 29 32
- q6 R2 l' L6 K8 p* R! c3 A里程(km) 501-600 601-700 701-800 801-900 901-1000
* h: d* G% y: ~+ N运价(万元) 37 44 50 55 60
' d# M+ ]; h& C7 u1000km以上每增加1至100km运价增加5万元.
3 z7 C, W' o5 l f% ^; |2 X公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).2 n3 G$ e+ a$ u G0 F4 c' Z
假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.
' x E- o, [8 H, d1 u& h5 D$ m9 N . {. L E: Q3 ?" y
试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.
4 _! Z, K5 \/ D9 l6 q. b三. 模型建立" s9 V+ a7 \: x( |
设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :
( ]' W% C+ W' G. ]* _4 {
$ j0 N" ^! [; F8 W$ v& K ?利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离" E/ r- B7 R$ G2 b. A( q8 ~1 y
% |! w' M5 U4 L U
解:先写出带权邻接矩阵:
) K0 [8 [4 {6 Z; z5 ?! b' H # t. m1 }( A8 P6 J) `, I# G7 ?
后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .
" S, F+ y# ~- S. E8 ?四. 模型求解(含经调试后正确的源程序)0 ]+ o6 ?% A7 [3 V, A W
(1) Dijkstra算法
: n0 p$ G" y& l; L9 Aroad1.m文件源程序: _1 |0 R; p; ?" m
w=[0 1200 inf inf inf inf inf inf inf inf;
- P) ^6 Y) ]& d1200 0 12 202 inf inf inf inf inf inf;
! ]% ?' R* ^; d0 ?inf 12 0 inf 201 inf inf inf inf inf;2 e6 {5 ], I. k/ U
inf 202 inf 0 31 20 inf inf inf inf;
& x8 D: l5 R4 i5 P$ \( Qinf inf 201 31 0 10 inf 205 inf inf;% s( j' @: i3 b) R0 u! S
inf inf inf 20 10 0 195 inf inf inf;" t6 Y" a2 a L+ f& x4 }+ G8 Q
inf inf inf inf inf 195 0 5 306 inf;% I3 {* L0 L- I( [+ v, U
inf inf inf inf 205 inf 5 0 inf 194;
) h2 c( d+ s# j# }0 ^ I0 pinf inf inf inf inf inf 306 inf 0 10;
8 s- ~% G$ P( A4 @inf inf inf inf inf inf inf 194 10 0];
3 J8 U/ c* i% n5 c I0 Pn=size(w,1);
, j8 b; C2 W) S0 g% y# Lw1=w(1, ;
* b* i5 W$ e) rfor i=1:n
. e+ B' r% u$ [' S8 X l(i)=w1(i);7 |+ \5 q8 ?$ h' X* X$ l
z(i)=1;6 y% s& a& X1 N! s
end
3 h; W# Q) N1 {$ v: y& [ S$ _s=[];
2 I1 r, q6 d- M) p" w# |& zs(1)=1;
( K6 M; N0 I% d2 bu=s(1);) ~6 Z [& S6 |! Z0 i
k=1;: K, I2 H# b6 L' O. ]
l;7 w' @$ E, L' N
z;+ e; B) u [, B. R
while k<n
3 O! u2 B* l" Y j5 a9 h9 W for i=1:n
" d- ]* V \) C. i9 ^! R for j=1:k
! N/ _4 `# l m0 O/ c5 p) u if i~=s(j)4 e8 z O$ P0 `+ t
if l(i)>l(u)+w(u,i);( Z5 {& N' T- ?& n: o# D
l(i)=l(u)+w(u,i);
( `6 @/ w! F' Q( R4 Z7 h/ s. \ z(i)=u;
- n, F' [) I. R9 [/ ?& z: I end
7 ?; ]$ }" N5 l) p# G+ ~) Z end
" i0 R) I8 @/ N: f end/ t% d$ {5 M. e
end
3 e# o) L1 P5 G" b1 t H4 ?1 q% j l;. M8 s3 m/ n1 L& T
z;( `5 D, `1 i4 q" O8 A J
ll=l;+ V1 [7 \8 |/ V! {% z; r! j' J
for i=1:n G+ ]/ U- C7 ]! @/ q/ ]0 ^
for j=1:k8 J% d, Z" s. N } M
if i~=s(j)
! ~- P2 {. K: c- O9 X& s ll(i)=ll(i);. q- E! q/ y: Q6 O
else& C w# D3 F- V4 _$ `. k
ll(i)=inf;
: R7 z2 z. U$ ?' N2 p/ W- I end1 ^% K) `# M" X: p1 f" b: k; e4 d
end4 u* Z$ r% G. r+ d6 ?/ v
end5 @2 p8 r$ c2 g: s7 K* \4 W: {
lv=inf;+ M2 s, C9 a+ E! P' J" w8 u
for i=1:n3 F- m: g% x& m5 w$ e! L
if ll(i)<lv
" c! y2 q; C' N! @& I) a' Q# V lv=ll(i);7 n1 r$ n/ t2 ^6 ~. T
v=i;- a; u2 p) I. Z" j) u: J2 ~
end
4 H* C& L9 g" U; w2 |: O$ c0 oend9 x6 |/ Q+ B0 o9 l& I8 j+ @( k
lv;
% T/ a" E% a" p4 O1 Ov;
3 ]2 f' W9 ]( n$ Vs(k+1)=v;- @' r) k) G5 z7 I: W1 A6 Z
k=k+1;- t! ?& d8 u6 Z Y- L) S
u=s(k);
" u$ e% K1 T" P3 G$ M+ qend
, n* h! K- r" q/ {2 F" Ql
9 v6 e9 B, S4 r6 _9 Bz
4 r% @7 w9 @6 a3 I; Z/ O: B& E2 s
(2) Floyd算法& O& X( v4 I- Q2 s, I' l
road2.m文件源程序:
8 x# }% r5 [4 ta=[0 1200 inf inf inf inf inf inf inf inf;
7 \' H$ r! V* y; _6 M1200 0 12 202 inf inf inf inf inf inf;; A6 O( ?3 T! p
inf 12 0 inf 201 inf inf inf inf inf;
I" Z2 d* ?* Dinf 202 inf 0 31 20 inf inf inf inf;
# j. u$ t: W7 `3 Pinf inf 201 31 0 10 inf 205 inf inf;
6 K5 H3 D: f& X6 `inf inf inf 20 10 0 195 inf inf inf;
) |4 [0 }; @1 _5 a( c. K7 jinf inf inf inf inf 195 0 5 306 inf;: G$ b- b6 B' [0 b
inf inf inf inf 205 inf 5 0 inf 194;- K6 |( I1 l( \3 m7 O m) l9 {
inf inf inf inf inf inf 306 inf 0 10;
( _3 ~/ {* g9 [0 ]1 z' n# rinf inf inf inf inf inf inf 194 10 0];7 |1 j# h6 \1 Q) ^" o' k
[D,R]=floyd(a)& q' ]/ m( c3 V9 \( N- J7 e
floyd.m文件源程序:
( d9 b7 _/ R( {' N+ ofunction[D,R]=floyd(a). h5 D& |1 F* x+ L0 G" l
n=size(a,1);9 ~" }; v+ C$ `$ E# y
D=a9 X. ^. h, V* T i+ B
for i=1:n3 C6 o% k* C$ i- X+ E( C
for j=1:n/ f: r( W7 J8 f* A c
R(i,j)=j;
4 O3 z' _7 [! n1 E% X end! W( _, m# T7 e8 r1 j4 c' m
end
3 r) \8 p8 ?. {5 o2 Z6 SR
, L% Q9 L: P3 Sfor k=1:n
7 @# q% [# X, V8 r3 _ for i=1:n; Z. k4 ?' y; u4 z6 a
for j=1:n
7 g* Q+ l( h" k if D(i,k)+D(k,j)<D(i,j)6 ]2 f% V, v) @( \
D(i,j)=D(i,k)+D(k,j);- j) B! t Z) a8 c* d
R(i,j)=R(i,k);$ x; u* ~+ F+ \4 \9 g
end% V: n8 E) Q$ J5 L
end
5 C$ I' _; o( `) h3 r9 e' ] end
+ n; \2 ]- ^+ ], O9 l. L k7 E& p7 `2 \8 P/ |/ y
D7 V: W7 t+ x; h& T- Z
R: n. n1 ?: h3 x5 I/ M
end
" i8 a. r" N$ P, p5 |$ H: R五.结果分析$ K8 ]( S* N7 L& @4 I. O4 j
(1)Dijkstra算法% n8 S' c8 q }/ x5 b( i
运行结果:* K; ]4 Y) a2 x
l = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812+ Y+ n- C; k$ d5 ?. `- e# h; C
z =1 1 2 2 3 4 6 5 10 8
- t: Q" W% q& J3 z- c- {8 W 1 k4 @5 l) U: D9 `# E9 ~. R6 j
结果分析:
! J: ^( \; K/ N" e7 W" `通过运行结果: 到其他顶点的最短路的权 ,可看出,! U+ x3 T- C& e [3 T5 q1 x
到 (即 到 )的最短距离为1812(km);
0 i! U3 z: m, X4 x/ d j f. H 到 (即 到 )的最短距离为1618(km);0 f5 l; y7 f @! Z) w
# @- B; V7 z* `" F% E% t 到 的最短路径为:V1→V2→V3→V5→V8→V10;; i; c K( [/ i& t
到 的最短路径为:V1→V2→V3→V5→V8。
1 f% M7 t) o; W2 A# z5 w1 R2 z9 {% z) X/ }5 _7 x- F( o
(2) Floyd算法' l4 N8 r0 a4 O) K8 F
运行结果:" }) c9 d, i' E
D =1 B/ d, I' a: g6 @
0 1200 1212 1402 1413 1422 1617 1618 1822 1812- g, ]' p5 i2 R& T5 Y% r
1200 0 12 202 213 222 417 418 622 612+ o. l, ?# {; M) A
1212 12 0 214 201 211 406 406 610 600* q: v0 R4 N' b$ b0 b
1402 202 214 0 30 20 215 220 424 414- O. }' @& K! ]9 v- |9 `
1413 213 201 30 0 10 205 205 409 399, p' Y% C+ v. Y/ h& U
1422 222 211 20 10 0 195 200 404 394
& q- i0 s. n0 h. G \$ ] 1617 417 406 215 205 195 0 5 209 199
, w9 L, w: V7 n9 E: z7 G* W3 b 1618 418 406 220 205 200 5 0 204 1944 B% B) e& x/ N1 w4 P6 A
1822 622 610 424 409 404 209 204 0 10: I! f4 s9 }6 L5 J: F
1812 612 600 414 399 394 199 194 10 0% M# C' f1 S/ O9 [! s
5 p, R6 Q" z" }. p* jR =8 G/ x8 S" o2 `, r) u
1 2 2 2 2 2 2 2 2 2$ {3 Q2 l) z& p1 l9 M8 z0 x
1 2 3 4 3 4 4 3 3 3
5 \/ W* b$ b0 g/ Z7 l$ Z: G 2 2 3 2 5 5 5 5 5 56 p) R# v% ~8 Z9 a- |1 j8 U6 T# N
2 2 2 4 6 6 6 6 6 6; H0 J+ E; b8 u+ r- X7 o1 b( @% I H
3 3 3 6 5 6 6 8 8 8/ v& k2 H" L* d8 D) d
4 4 5 4 5 6 7 7 7 78 p7 A/ E3 R- ^
6 6 6 6 6 6 7 8 8 81 A" i- s( \& R U @
5 5 5 7 5 7 7 8 10 10* t% y' F; a# k& \
10 10 10 10 10 10 10 10 9 10# F8 ~; |4 J( y! `; i
8 8 8 8 8 8 8 8 9 10* L; f% t! [6 z9 [
结果分析:
' k5 ?/ ^: M7 h" P# S0 z/ L通过运行结果:可看出,
6 ^% [# l1 l+ w 到 (即 到 )的最短距离为1812(km);; {: i6 j% N6 ]+ q4 y1 u1 Q
到 的最短路径为:V1→V2→V3→V5→V8→V10;' ~2 q0 k+ y @9 I5 {/ U+ @
到 (即 到 )的最短距离为1618(km);
9 g8 `+ C. b# A7 `- q 到 的最短路径为:V1→V2→V3→V5→V8。, m1 U; `8 }* g' W; h& b* y
, b- q' @ G# ]8 l1 p) K) p
3 C7 b4 Z9 |1 Q+ z0 B$ b2 S6 E
|
zan
|