- 在线时间
- 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]初来乍到
 |
最短路问题及其算法
+ L, K) p1 o1 p一.实验目的:
: F( o% y M( \8 N% g5 r1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;' X9 o3 Y3 H! Q0 G4 z. Z4 k$ ^9 ]
2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.$ F6 z. k7 R" r
二.实验内容:/ p1 p8 J) f; V
要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).+ C7 @3 L+ l; B! r& `+ L
为方便计,1km主管道钢管称为1单位钢管.0 J' i s/ _- v. B0 H
一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表: N" n; Q6 V: _! i. `6 @7 Q
7 _1 d$ m( K5 W. o6 e$ {( w1 2 3 4 5 6 7
2 N3 B; x9 C# s4 I2 ~+ L8 h
* r+ D+ @% d! W) @! P800 800 1000 2000 2000 2000 3000
8 ?# A2 d8 Y* i6 d- [9 B9 f 5 C. \. i; X% D
160 155 155 160 155 150 160. c4 m) k3 S9 h9 D5 D( |/ ]4 O Q
4 F# L6 b, N1 s' L2 B/ o1单位钢管的铁路运价如下表:
( Q* ?4 I6 [/ y6 J' R里程(km) 300$ r3 G7 O. \8 f
301-350 351-400 401-450 451-5007 Z- H6 V, x* j+ y8 b# c
运价(万元) 20 23 26 29 324 a6 L$ p7 |2 U! a+ t0 c; v
里程(km) 501-600 601-700 701-800 801-900 901-1000; `! X' m* V2 W/ i! q% k
运价(万元) 37 44 50 55 60
, l$ v0 n N! G# u1000km以上每增加1至100km运价增加5万元.
$ j0 P4 |! C6 k+ F公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).' M- g: r' F2 `
假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.
J7 H( \* ]4 @' k5 d9 K/ X3 C 0 N) {) M5 f# Q! C5 ^3 F
试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.0 b5 O% z2 E6 s3 w! P
三. 模型建立% g' n' i7 N' p
设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :5 ^ L$ c6 f) m; N# }
) v! f ~( h( H* ?; v
利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离 Y# @2 a* H5 ~2 ]2 _' A; Q
; a% [ q6 f6 o4 ^. ]% P" a2 F
解:先写出带权邻接矩阵:
* G! t/ ?5 p# _) f w# [
+ J( J: ?7 p! u5 ^* ]6 D4 O后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .
7 Q$ @! ~7 I$ B; A4 c) N四. 模型求解(含经调试后正确的源程序)7 ?/ S; B9 e% n2 N
(1) Dijkstra算法
# a" W" M% a9 D# e0 E/ W6 ^( Droad1.m文件源程序:
3 n4 N$ ?' r( j6 J: J! \! p# rw=[0 1200 inf inf inf inf inf inf inf inf;& o7 o5 ~1 B+ u; z/ @( n& p
1200 0 12 202 inf inf inf inf inf inf; v; E _" K/ ]
inf 12 0 inf 201 inf inf inf inf inf;
3 ^# e' x0 u1 t$ F1 f+ H5 u( p; hinf 202 inf 0 31 20 inf inf inf inf;
! d( M* D+ X( F+ `" l# q W& I" Winf inf 201 31 0 10 inf 205 inf inf;$ s+ E; P! T' e J
inf inf inf 20 10 0 195 inf inf inf;* }* u! r7 N$ n( a3 f3 s) K
inf inf inf inf inf 195 0 5 306 inf;
; z3 `* Q- q: M. |. ^2 g- Tinf inf inf inf 205 inf 5 0 inf 194;
; o5 y& Y+ q: ?# y* Iinf inf inf inf inf inf 306 inf 0 10;8 d8 v" U" Y6 W$ M
inf inf inf inf inf inf inf 194 10 0]; 4 k$ N* ^/ C! r2 H* b& A1 p
n=size(w,1);: o+ z; a$ Q9 ^2 K: y* b( W
w1=w(1, ;
& f7 j( J$ F3 b" Q. sfor i=1:n% G% s1 [2 X# x! b3 K2 Q
l(i)=w1(i);
3 M4 g: F: J9 x- C z(i)=1;
* a; y: c K) f1 s% tend
% f! f3 d" u$ I5 y, H) E8 Ys=[];
; Q S- G5 K2 h: v6 O% ~; ` Ws(1)=1;
9 a0 k# |3 v U! s% E/ z' {- L0 Fu=s(1);
- E4 l) k$ }" ok=1;9 _) Q, ]2 S: {' \; T% w; P; X
l;5 J! L/ J* x% s- ], X& \
z;
3 y r* ?7 b1 V2 x( K2 A7 Z3 F# iwhile k<n3 O# [. z+ m3 b! h& z/ p
for i=1:n
3 c) O3 \1 `2 S) ] for j=1:k
' J$ q3 ^9 ^* C3 X if i~=s(j)" w. c& P# x% b, G4 F1 r `: Q
if l(i)>l(u)+w(u,i);+ g3 n2 B5 q/ B" Y
l(i)=l(u)+w(u,i);/ a9 y: [: J2 L/ x. ]" J9 _
z(i)=u;0 t9 H' z2 H: O* w* j: W
end, p) [" }( k$ D1 f
end8 D* `, [5 ~! i; K
end5 U& T) k$ L2 ]
end$ V/ S C; r) }2 d
l;
: C# r k/ N) _& T, d$ [9 z z;
4 \: C; z3 `5 Xll=l;
) t5 J& \8 `, L7 a& u for i=1:n
3 u& t2 U3 z4 F' z# c+ {0 T+ | for j=1:k
! t8 L4 E2 F7 g7 s3 s% F! Q if i~=s(j)
?3 \. i4 b/ F# {0 K' h ll(i)=ll(i);$ e) Q9 m! k% H2 l% Z
else
8 D8 a' a# F* ?( [" t( W ll(i)=inf;
- e6 {- ?% i. P2 N8 K. s. U# l7 e end( W# Q8 [' z S9 g# n+ D0 q
end! u3 ^2 H" _% G( o7 G# }6 @& t
end
8 B% e5 p% s7 q& l' M; mlv=inf;
* x3 U6 n9 t2 ]+ s( l( Ffor i=1:n
2 W. C: [# V2 _9 l if ll(i)<lv
6 A. c: c: l' o. E2 G lv=ll(i);
5 i _7 [1 }' q" ~ v=i;
( W! w c: C9 H1 a end
+ S" h6 _: b$ v4 Uend6 M- `/ Z; j8 a+ [/ h% D0 C
lv;. U: z4 r: S: i% V5 y' t2 x
v;1 d) Q8 l+ q( x0 j
s(k+1)=v;2 N. ^6 l$ h9 r# O
k=k+1;# ^( k- o1 L! a+ ]- U6 ^
u=s(k);9 A/ F z! e. U* r& ^1 b4 e
end/ f/ q4 K H+ J2 o* H. i
l# H I: z0 c+ x
z1 m" t8 T: D0 R" \4 @7 h! V8 [+ _( g t
7 M0 a: w# s5 W4 @+ u" @
(2) Floyd算法
$ [8 {* A) h3 Lroad2.m文件源程序:# E" r" {1 b2 `% {4 y
a=[0 1200 inf inf inf inf inf inf inf inf;
8 J; { W2 o' w9 h1200 0 12 202 inf inf inf inf inf inf;
# Z) z X! R9 z! P- Zinf 12 0 inf 201 inf inf inf inf inf;
' B1 _& A- u! _inf 202 inf 0 31 20 inf inf inf inf;. n+ P- w% j+ m( m
inf inf 201 31 0 10 inf 205 inf inf;9 h, l( J2 o+ F9 d' Y, F6 ~6 x* Y+ A3 x2 L
inf inf inf 20 10 0 195 inf inf inf;
2 d. @. \% ~8 oinf inf inf inf inf 195 0 5 306 inf;* h9 i! ~& n" h" j
inf inf inf inf 205 inf 5 0 inf 194;
0 \: L/ M: F6 x: K- b/ \& ?" Yinf inf inf inf inf inf 306 inf 0 10;
" I( r, \9 w! v" ainf inf inf inf inf inf inf 194 10 0];
% c) z- I" c$ ]7 m/ V. F. W% ~9 A[D,R]=floyd(a)
4 G3 l, s4 X- X, c+ a& |floyd.m文件源程序:3 _- U- ^, l' ?: E) m6 r) H
function[D,R]=floyd(a)) B% T1 y1 x& x) @0 H
n=size(a,1);0 n9 ^; f, I) e: u2 _
D=a
- `5 F y, R0 E g1 R; l8 Rfor i=1:n
|9 u4 X; X' O8 D8 l, s for j=1:n4 p3 @, `: [* N0 l9 L2 X
R(i,j)=j;
) D8 A5 r* K: w2 o9 U end
" C7 r5 m# J( ~/ X( ^end
, S0 R0 I+ [) r5 V# E0 ^R7 K; A9 k3 {" ^4 d! l2 B Q
for k=1:n
3 I4 }8 A, x: R, H for i=1:n
0 l. m, c4 S1 ?/ B( T& V for j=1:n
6 u" G$ n: N- }+ z, P if D(i,k)+D(k,j)<D(i,j)- `2 ]# H2 ^+ n: G4 {3 U
D(i,j)=D(i,k)+D(k,j);
# S# e9 O4 w2 |. \# P R(i,j)=R(i,k);
& ]2 |2 a; q! c6 W. o0 M4 w3 ?4 } end( S. p2 M; s6 q: I; d5 Q! r+ C9 z
end' ^; k# ~4 s. x+ t G3 h( I
end
# G, o, w7 R* r! \ k
0 r X& F* K2 C' g- | D
+ P3 W: S% A, Z; u! I7 d% V R2 t) \6 h, {2 ]0 o
end) m9 s- H1 q8 H$ ^& a6 }* A5 r% {
五.结果分析 m o& R) J8 o2 w1 x# V6 Z
(1)Dijkstra算法0 L C1 P y8 j; q( E
运行结果:
4 r- @& q5 `3 Z; t# w+ l1 {l = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812" e* d. j2 X& Y
z =1 1 2 2 3 4 6 5 10 8
& E/ k0 z5 Z/ C
" Y. q& c4 Y1 n$ M. d; I" U结果分析:
4 r1 t P) s: h; |& t通过运行结果: 到其他顶点的最短路的权 ,可看出,/ N; Z/ |0 v* y. {4 D6 a7 R6 m" R
到 (即 到 )的最短距离为1812(km);) p: G; O( G" D6 |) d1 V3 y9 R
到 (即 到 )的最短距离为1618(km);
7 q' ^" k+ z, Z" L" G+ z F" l9 Q k* X' }( s
到 的最短路径为:V1→V2→V3→V5→V8→V10;! L2 N/ G1 _+ f5 }
到 的最短路径为:V1→V2→V3→V5→V8。
1 }% y) G+ P- U( c6 a
# b. g8 @5 | k5 L/ ^0 d1 U(2) Floyd算法5 v2 C1 s6 N7 ~: j# ~( t% w( k4 X
运行结果:
$ w6 m" J- H6 v2 N9 w" h+ jD =
% N+ G: v. j% I' ^+ O2 m4 ? 0 1200 1212 1402 1413 1422 1617 1618 1822 1812, Z; B; z; [+ P3 Q7 L3 P, i
1200 0 12 202 213 222 417 418 622 6120 G) w2 W5 n' @1 M
1212 12 0 214 201 211 406 406 610 600
# q7 a! t X; b _# m- f. e7 l/ m 1402 202 214 0 30 20 215 220 424 414
5 s) ?# `+ A4 X9 y- j 1413 213 201 30 0 10 205 205 409 399
* T- ]+ J \( R& ^ Y3 y, ` 1422 222 211 20 10 0 195 200 404 394
0 F4 s) r: f% w; E& X& ? s 1617 417 406 215 205 195 0 5 209 1998 z# z5 I, O r- X
1618 418 406 220 205 200 5 0 204 194. z& k' T1 D. F0 c( u
1822 622 610 424 409 404 209 204 0 10
3 C2 t1 A- Q3 l 1812 612 600 414 399 394 199 194 10 03 b+ d; r& g% W- E3 ~/ @
; k' T( [- `# J) \) v) F, [0 `
R =
" Y( G) g* a1 E; N 1 2 2 2 2 2 2 2 2 2$ A4 D# {2 z F3 y
1 2 3 4 3 4 4 3 3 3
) F" J7 o* C2 {' D: y; A9 T# D+ Q 2 2 3 2 5 5 5 5 5 55 D& p: {5 n' |* p+ e# K1 [- j- N
2 2 2 4 6 6 6 6 6 6& Z) _, E, |' b- y) u' b! X& |7 \: ~
3 3 3 6 5 6 6 8 8 88 Q1 \# R* ^% C
4 4 5 4 5 6 7 7 7 7
7 c* o; J8 J& q6 A 6 6 6 6 6 6 7 8 8 87 o! A/ K2 U: k7 w0 P
5 5 5 7 5 7 7 8 10 10
) u3 J' ~6 O6 d/ ] A; r 10 10 10 10 10 10 10 10 9 10
+ d, Z5 n) \3 v* z 8 8 8 8 8 8 8 8 9 106 u, ]: }7 @' {9 c5 B' }# @( b
结果分析:; Y( e; H. q! s+ @$ j2 m3 H
通过运行结果:可看出,$ r$ s6 t9 {$ {( b
到 (即 到 )的最短距离为1812(km);; l ]! o5 ^' r, i! W
到 的最短路径为:V1→V2→V3→V5→V8→V10;
7 p* M; q( M; @( s6 b t9 h 到 (即 到 )的最短距离为1618(km);5 }$ Z1 V5 A Y; ?
到 的最短路径为:V1→V2→V3→V5→V8。
" A' h0 x6 t2 G0 n* G$ e |9 f
q' X4 x3 W! P$ T; ^1 I
: w) r, u: o9 L+ p) z# N$ ] |
zan
|