- 在线时间
- 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]初来乍到
 |
最短路问题及其算法9 V K8 O$ u3 I/ Z8 C
一.实验目的:4 U8 y0 R$ e8 \* @8 r
1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;: y# q- L2 ]2 Y6 B8 q
2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.
, j8 e! i9 x: x( j! C, D二.实验内容:8 f9 A4 p" O" k! ]
要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).
4 b6 {/ K, L% r8 r8 {& @+ y为方便计,1km主管道钢管称为1单位钢管.: @/ b, x- M4 U7 c! U! }8 P
一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:
6 V: B$ _7 @: v3 E
. H$ Y4 u+ g9 m1 [1 2 3 4 5 6 7
# m9 h' G: \: M7 g
- z& {' H" |% Y# d, _, m0 u/ V2 Z800 800 1000 2000 2000 2000 3000) ?( M' C* q2 K( o7 P( I
$ }9 @( C4 i, {* z d160 155 155 160 155 150 160
& [- v, Q) E5 z: f
9 ^" t0 a* r3 g9 J Z9 h* v2 s* ^1单位钢管的铁路运价如下表:. O0 [4 o G& E X) H
里程(km) 300
2 `/ p" X$ X7 k. e301-350 351-400 401-450 451-500
/ z$ s' f8 v) P" t2 D: ^运价(万元) 20 23 26 29 32
* _5 s+ K$ @) P4 S9 H( W2 d9 A里程(km) 501-600 601-700 701-800 801-900 901-1000
0 ]: `' m* Y: r6 A: z运价(万元) 37 44 50 55 607 S# T, |( H8 ?- R3 t
1000km以上每增加1至100km运价增加5万元.
, ^' v, c3 `: D! N2 v3 T* v公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).
" w' Z9 f' x$ }) p* l假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.
1 B) u( V, B& E: V ) e# m. j: h( i3 j
试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.
; m; X) a# M( Y! t: A& y三. 模型建立, V' B2 _5 b" ^4 }9 E) n7 [
设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :
% g( A( j6 D9 H$ Y4 V+ C6 O1 ^
/ Z2 c" M, d3 D+ @+ A/ ]2 `/ n' q利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离
' T5 \: B' i" b3 F , o# _) M' W$ o! x
解:先写出带权邻接矩阵:
% T3 M# y [' e" ?# S, L, x
! B- f9 b" Z% O! F4 r8 t后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .8 _4 Y+ P+ y W7 J$ K% A! M
四. 模型求解(含经调试后正确的源程序)
, x$ K ]# b' x7 e" v+ q(1) Dijkstra算法
( O3 [. s1 D% {8 }road1.m文件源程序:
8 F* ?7 z7 T r; K1 ^9 l# Zw=[0 1200 inf inf inf inf inf inf inf inf;# C& }3 g1 W; Y& h3 v- O6 P0 \6 k5 k
1200 0 12 202 inf inf inf inf inf inf;
1 B1 N8 M' H& C R- Winf 12 0 inf 201 inf inf inf inf inf;5 c+ P" _9 @+ l( R- w
inf 202 inf 0 31 20 inf inf inf inf;" S5 B' v- k/ b0 D# d
inf inf 201 31 0 10 inf 205 inf inf;. X7 z0 S; F" D, O7 h: p @
inf inf inf 20 10 0 195 inf inf inf;
4 E o8 H# Z- sinf inf inf inf inf 195 0 5 306 inf;( S \% u' M2 J" s0 Y. ]) ^
inf inf inf inf 205 inf 5 0 inf 194;* w- `. _7 ^/ B! U, N/ V# U
inf inf inf inf inf inf 306 inf 0 10;9 L0 v' u- U# [( {4 E
inf inf inf inf inf inf inf 194 10 0];
. K1 G* |( `) C7 b7 p; On=size(w,1);* o0 w4 Q* W% j2 O
w1=w(1, ;
; ?% G( y# i/ \) yfor i=1:n
# T; \5 y8 A1 R b u l(i)=w1(i);
! R1 d& R7 U9 U1 ] o z(i)=1;- ^3 r& a6 K4 l( l& y+ N- L
end
' o: M: v+ H4 x0 M, d! ps=[];: r) Z. E7 f3 [9 J" R$ W7 r
s(1)=1;0 D s# R b4 l3 X+ @
u=s(1);4 t: S! a# V7 T0 `8 ~
k=1;
: E' M* X+ |1 Q+ H# A; fl;( y- Z$ }1 A, n2 Y
z;4 `' I+ y! l- `2 g7 v* e
while k<n
9 i6 ~/ X C7 @* ?0 y e2 v for i=1:n
, V; T+ H5 @8 M: s4 t4 k3 D2 U9 V for j=1:k
* m# X' h7 H5 F- f& g if i~=s(j)& ^# N0 G+ R8 L; C0 ~8 f# {
if l(i)>l(u)+w(u,i);
S. n8 q- P' m1 |9 T) S+ ?9 T( t* D l(i)=l(u)+w(u,i);
7 V2 x0 h' x3 Y J8 M8 ^) L z(i)=u;
5 c- |- T# e7 N3 t end; I! j$ a% T0 u9 l% Y
end
. T: [1 u9 c. r, ` o end
3 Q$ f0 I5 O' i+ z( cend0 j; P& F' V! u1 |5 \3 X; w
l;
. ~" \4 Y% P' H9 d8 {2 Y+ q5 t. b z;
6 {3 w9 s4 M: z I! Rll=l;, B% `- }/ G0 m# k. u' Z
for i=1:n
7 [& p/ ?4 m: m! `" T for j=1:k
1 C' }1 m9 e, J) B2 z* X if i~=s(j)
$ V k3 g: j5 G; ?, e7 m" W9 m3 t ll(i)=ll(i);
+ U" W5 T6 b" b- t6 Y else# ]: Y g: r7 l
ll(i)=inf;
' R3 C% |1 L# _7 A0 d end
, e" f) p' p* L- a ]) g0 d* cend
3 R' c6 \1 z9 L& d' Z W( Q: pend' e, R7 C( X, A, p6 J
lv=inf;0 S" v& d$ l' W7 H+ x8 a X
for i=1:n3 R' [# W& g; y* O/ ^2 f0 ?
if ll(i)<lv. A+ e6 I7 c3 y: T8 T
lv=ll(i);
; d+ |/ q( C* k0 u" t v=i;% T3 a* i5 o$ |% {& m% s2 c
end
S; q( I: A, H: _" S7 A, cend
* E U& G2 m( H$ _. p) I$ z5 Hlv;: M) Z' v6 { `) M( H2 }. x- Z
v;
; i( U; }- S1 h( ws(k+1)=v;
9 x2 L" S" m& T0 c7 jk=k+1;! \+ `" ^7 u7 W/ {- ~2 g1 t& c% ?/ f
u=s(k);* d+ K- N3 t8 r( h0 `) {
end
: g- l i2 T1 H. bl
9 v" I, V6 e3 C2 h; c) p/ ?z" d7 `" {* t, W9 d% L7 V
2 K6 l0 M- O$ a- R7 y/ ?9 i4 G
(2) Floyd算法8 W1 ?7 z, U# q% X+ o) q
road2.m文件源程序:
+ N% X. y) B/ Da=[0 1200 inf inf inf inf inf inf inf inf;
2 F' n1 s# w; y$ `( n) Q3 v1200 0 12 202 inf inf inf inf inf inf;- s8 \6 ~1 v1 U/ y" d' K
inf 12 0 inf 201 inf inf inf inf inf;
3 ~, X7 a' ~1 y' X6 l) {2 @7 Jinf 202 inf 0 31 20 inf inf inf inf;6 }. p3 M9 E+ S& d" X
inf inf 201 31 0 10 inf 205 inf inf;
) U- X* k! ?0 ?* `3 \5 k' ^/ xinf inf inf 20 10 0 195 inf inf inf;
9 f) [- ^8 l* ~: i' \ _. `& [inf inf inf inf inf 195 0 5 306 inf;
# q+ \+ q7 ^5 g3 S' tinf inf inf inf 205 inf 5 0 inf 194;( r0 b- g7 a9 y `
inf inf inf inf inf inf 306 inf 0 10;% K6 r4 }8 k4 b
inf inf inf inf inf inf inf 194 10 0];
* {8 o0 H* C- V7 l$ _! I& b[D,R]=floyd(a)
2 V- x- ^. {- Y: b+ r( O zfloyd.m文件源程序:
, i+ q, I# W. k6 i5 y# M- V) Hfunction[D,R]=floyd(a)
; d; W$ Q( c, P8 u' q, l: `, vn=size(a,1);
+ Q$ s m1 j6 P, ~8 l& R( y+ t5 X; pD=a
- z, |1 o! B3 I3 c( X% kfor i=1:n+ b, ^6 Z& {' X( \% A C, a
for j=1:n7 i# E! U+ L# r7 V
R(i,j)=j;& O* ~" Q2 P2 N9 l
end
8 S- b+ m) Z7 W# H% F+ aend+ u0 I* }1 C3 }6 n a
R
$ h8 I( n1 I3 M& R; @for k=1:n
* z6 \! K! `/ o: u; z* z; n for i=1:n6 _* M: }1 @9 A2 }7 x( G+ a. a9 F- |+ G
for j=1:n5 p0 T' [' B% M0 f
if D(i,k)+D(k,j)<D(i,j)7 J7 }1 G6 b0 f
D(i,j)=D(i,k)+D(k,j);5 o5 M9 X: M1 u% E. g1 {! g5 }; z
R(i,j)=R(i,k);
4 A, I. K$ \; l' J6 H& x0 r end0 j% q. Q( K2 z9 ~5 f |
end2 C9 x% _2 R9 d5 _! @; b3 o
end
^, I' i8 Y5 u8 J" C. O. x k
: ?4 [9 H4 R& \, o6 c2 u D
! F. v( M5 z) W& G; G1 Z, l$ l ~ F R
! I- I6 q A5 L$ P; hend
" c1 T+ `% f: W1 }五.结果分析
' n _' m" x8 `3 @) H(1)Dijkstra算法! ^' d5 [% O+ N, Y5 n: H+ p6 G# [
运行结果:
1 F7 `+ J3 M8 `0 H) ]; t1 V/ A# Kl = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812
2 i, U5 C7 k+ |. U: S2 pz =1 1 2 2 3 4 6 5 10 8
+ e6 e7 ~1 v9 g4 @* C 9 o/ p) c" K6 P, X
结果分析:) \+ ?" ]8 M+ X) N& J2 i0 I! q- R
通过运行结果: 到其他顶点的最短路的权 ,可看出,. r( X m7 o1 g2 h7 n+ c
到 (即 到 )的最短距离为1812(km);
, m6 U+ Y* H' G+ C: M 到 (即 到 )的最短距离为1618(km);3 F" @& q( ~' i3 A# m
0 A5 ^4 }* @( Z& F( }$ U% p& b
到 的最短路径为:V1→V2→V3→V5→V8→V10;# ]" \4 w8 M, a9 E9 d4 q" [' D
到 的最短路径为:V1→V2→V3→V5→V8。& j+ J7 l4 I2 a5 a
2 { z/ b- O5 y6 |/ m0 L" N7 _
(2) Floyd算法; ~! \% z$ f: ^, l
运行结果:
v% F( g t; i8 w2 PD =7 [& D4 X+ M9 j
0 1200 1212 1402 1413 1422 1617 1618 1822 1812# E F; c9 e5 a& i: O
1200 0 12 202 213 222 417 418 622 612
" |! l; |! U# y. A3 f& H# R 1212 12 0 214 201 211 406 406 610 600
( |; N2 T8 [1 I' } 1402 202 214 0 30 20 215 220 424 4149 d1 h# j! o: U( b! u
1413 213 201 30 0 10 205 205 409 399
, q. u9 z3 G8 U5 _ 1422 222 211 20 10 0 195 200 404 3948 a+ M0 H @; C% a) I" Q0 d: K
1617 417 406 215 205 195 0 5 209 199
* U8 v1 f, x h 1618 418 406 220 205 200 5 0 204 194
u% L) r) T/ r. a3 s- K 1822 622 610 424 409 404 209 204 0 10
; {# }- B% |2 s' F 1812 612 600 414 399 394 199 194 10 0
" C# D) O* ^7 m1 }0 u( C
. Z& Q! a! o) ~7 WR =
2 K, ]2 a4 M) V& i8 H 1 2 2 2 2 2 2 2 2 2& p' G6 Q& b- W. ?- m o( I( U
1 2 3 4 3 4 4 3 3 3
+ c6 U: T* e/ f7 u 2 2 3 2 5 5 5 5 5 5
/ ~7 Z( a0 w z. V) x 2 2 2 4 6 6 6 6 6 6
8 `# E* H& J; Z. X9 \ 3 3 3 6 5 6 6 8 8 8( R2 T# n# x A. W5 i
4 4 5 4 5 6 7 7 7 7
4 |; V+ Q/ G5 `% D5 M' j" @/ u 6 6 6 6 6 6 7 8 8 8
6 J% |( Z8 M- s$ ~, e1 v, \ 5 5 5 7 5 7 7 8 10 10
( C; g3 Q$ s# r7 o# n6 ~! q 10 10 10 10 10 10 10 10 9 10- \3 U# Q5 [& o( u+ Q* n6 M$ C' N
8 8 8 8 8 8 8 8 9 10) i* w7 K- ~# H) n
结果分析:
4 v7 O/ R& s+ U* _通过运行结果:可看出,7 u6 ~- |8 d: w( T: D9 [. C
到 (即 到 )的最短距离为1812(km);
_: ]& c. q: h0 b% ? 到 的最短路径为:V1→V2→V3→V5→V8→V10;6 v- R6 l$ `( h& J/ }1 \; H0 y9 k
到 (即 到 )的最短距离为1618(km);
2 ^" B/ t4 V( v% v 到 的最短路径为:V1→V2→V3→V5→V8。
% v$ _" V; f/ o/ T3 A2 K8 |0 n' z% L) [$ V) F- ^/ z
. d6 N( {& F* V5 { |
zan
|