- 在线时间
- 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]初来乍到
 |
最短路问题及其算法, O5 W1 h- W8 i
一.实验目的:3 E! g0 k+ e% A. h
1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;. O* @5 _2 N9 l" _! @# B
2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.
5 p7 m+ L* A6 ]5 h- t: ^二.实验内容:: Z5 r \& K( t1 V8 V
要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).
" ^ s7 ?$ s+ Z. Y4 |3 I为方便计,1km主管道钢管称为1单位钢管. z( S9 L" q1 m; ^* H; A, c
一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:
~ P3 z: [, ?+ @
: |8 r' O. q/ A6 l9 Z" h, y1 2 3 4 5 6 7
, g( _6 ~5 Y! U/ s3 Y7 X' N: `
+ v! G, v; }: l+ @+ {" l6 m7 l% ~: m800 800 1000 2000 2000 2000 3000/ b! a' @7 d9 n6 X
. i" f6 ]1 g% P- W( i160 155 155 160 155 150 160
# |6 x4 k. u, S6 N
3 u# G: Q' B7 T; M# ?1单位钢管的铁路运价如下表:
1 n- d m& t6 \7 `里程(km) 300) R0 n6 b/ ]! G# z2 u, T
301-350 351-400 401-450 451-500) C m* r$ w- o
运价(万元) 20 23 26 29 32
# R0 a& t+ _2 J0 L' K# O5 z里程(km) 501-600 601-700 701-800 801-900 901-1000% I" l! ^2 l$ e0 T! E$ m; P' F
运价(万元) 37 44 50 55 60
: M( I( Y. i: g2 |7 c1000km以上每增加1至100km运价增加5万元.+ Y# `! X( o, U' V3 i) R0 Z9 T
公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).
/ r! E" n% I3 Z6 H9 S& I9 G假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.+ \" C5 e% Z+ s( x: n: @0 B, Y( _# g, }
( U3 @/ o4 l# G, t( Q( Z* y0 {试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.- C/ |) Z1 _' s
三. 模型建立
* j' ^1 |! b6 x设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :2 r4 ]/ n- E$ n# f
7 P: Y, X0 F; x. O5 ^8 j利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离+ s7 a- t- F" r! F8 V) b
% I# m/ p1 G" a- d) t解:先写出带权邻接矩阵:$ l* M. g4 F; {+ b7 M7 w7 ?
. b2 s: p0 M7 x* V4 W
后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .
/ [2 T+ W2 {7 L) w% m9 s Q四. 模型求解(含经调试后正确的源程序)
1 s% A' H- }3 o7 y, V(1) Dijkstra算法
9 R- C$ x& P% I( Nroad1.m文件源程序:" k+ j6 F6 p* L3 h
w=[0 1200 inf inf inf inf inf inf inf inf;) l; ~6 S+ a8 y4 F1 W# f& \6 |
1200 0 12 202 inf inf inf inf inf inf;
* W4 W2 {5 T7 c# V- einf 12 0 inf 201 inf inf inf inf inf;- |1 j2 W/ f1 M: E
inf 202 inf 0 31 20 inf inf inf inf;$ O1 r- S# D8 W3 ^0 W
inf inf 201 31 0 10 inf 205 inf inf;
# E0 m( [7 {; u7 V5 x8 F; s7 winf inf inf 20 10 0 195 inf inf inf;, m( d$ H ]. T0 z2 v. }: w; z
inf inf inf inf inf 195 0 5 306 inf;1 ?2 X: t1 u& O- X& h
inf inf inf inf 205 inf 5 0 inf 194;& S; P! U6 x6 k" ?8 F, A. b" c; `
inf inf inf inf inf inf 306 inf 0 10;
7 L* k6 q+ q: Q2 L( }4 iinf inf inf inf inf inf inf 194 10 0]; 7 v4 e$ o* d/ N! P' H
n=size(w,1);
3 \ M+ I3 y8 D$ F- g: k. nw1=w(1, ;' w3 R' f9 K G$ @9 G! ^7 t( e
for i=1:n
% v6 a% \0 |' @! V& A l(i)=w1(i);
5 ]4 |7 ], C6 ?' I* Q z(i)=1;
" u" W: L+ V) ^4 K# ]% T: bend
' n+ u6 J1 F# ?2 m+ }/ S; Fs=[];
! f- t, O" n6 l6 ms(1)=1;
) R8 u6 j/ Z9 h, ^; ?u=s(1);
8 Q) j! B8 T; o& R4 h- hk=1;
1 ]! `2 G5 G+ J+ K* il;
1 B' W. N. X# a+ Yz;& P! {3 J0 s" X# d7 h$ D+ e& N) u/ [
while k<n8 r6 a: P' v( F# |& x8 Q$ y
for i=1:n
M! Q& P) f( i3 ~$ p' H5 a; G: k for j=1:k3 ?; C9 C* S- f q3 b# ^$ P( ^
if i~=s(j)9 c+ A: A7 `1 O! Z: Y
if l(i)>l(u)+w(u,i);
5 V$ E& Y+ @& i3 p! L' ]4 v0 m l(i)=l(u)+w(u,i);! H8 y6 c- ~$ y0 C; K# g
z(i)=u;
5 j8 G# P) E; q end& @: ~3 l' H P( \3 E% S+ z
end% F9 ]& q; f2 p5 G7 y
end2 A, N: o! e) c/ {, z
end! s$ s# m7 E8 P. W8 c2 \
l; Z& J2 I9 [1 S( C
z;
' \. J. S6 @# l2 G, K( _ll=l;
- U3 y( l: L' W" \9 y6 M; ?% u9 z8 | for i=1:n
% f/ r$ b) Q, s: t2 F; ^; z# T for j=1:k) W7 w0 m- b( X5 x( p% ]
if i~=s(j)
% x$ _- |3 |" o4 y" c8 {! A4 g ll(i)=ll(i);; N4 }* q! V8 g5 N# R" M
else
: M$ H6 K4 x8 P0 @/ K, U+ p ll(i)=inf;$ t/ _. o" q. D' l! B, _
end
# g' u' f6 e( S+ n9 U6 kend- s0 f2 v0 W4 D+ h) A( Z
end2 s8 z1 A' r o2 k* S
lv=inf;
2 S( F7 W( t) Q2 P! ^6 ufor i=1:n- U* v# l3 n3 U3 \
if ll(i)<lv
* B9 n T6 n9 `7 R/ D lv=ll(i);
2 w5 V+ N [1 f v=i;, d, V- h; y- a0 D9 F& ?/ d
end
: L& N. _: T5 Gend% u: L0 B' _. m8 A% ?# ~5 V; T. o
lv;
' M, k- }9 O1 C/ Z* v+ Lv;- p3 ^$ V3 U' }" J* I
s(k+1)=v;9 u6 V. \: g1 x4 C0 E9 a
k=k+1;
* B! i1 |- b2 o4 c" x# q( v/ ?0 R2 qu=s(k);
. j$ b6 [5 N, s5 Uend
( T1 i* P# B0 u% G5 F4 P8 ] Zl
: Q6 X! h. p; gz/ ~1 Y5 R% M& J2 E
2 P; ~1 s: S8 q# _
(2) Floyd算法
- d+ d4 o" c' a/ Q- m9 I8 b- Z1 Nroad2.m文件源程序:
& Z( K2 P8 P* c z" I! ]. t3 aa=[0 1200 inf inf inf inf inf inf inf inf;+ `/ X) k& b1 O0 v' B5 O) ~
1200 0 12 202 inf inf inf inf inf inf;0 S9 J( d! D' }+ \7 G2 f& `* p
inf 12 0 inf 201 inf inf inf inf inf;
+ p& W; s7 z: B" D9 vinf 202 inf 0 31 20 inf inf inf inf;" h4 b9 {$ ?0 U" h. X( _4 L# ?
inf inf 201 31 0 10 inf 205 inf inf;; ~" f8 E0 F4 D: L
inf inf inf 20 10 0 195 inf inf inf;
. ~& N* \ b9 Iinf inf inf inf inf 195 0 5 306 inf;
; h6 S1 X7 e L2 winf inf inf inf 205 inf 5 0 inf 194;
( o6 r" Y K- D9 minf inf inf inf inf inf 306 inf 0 10;! B; }7 z) X9 ?$ l! D) B \* e. C
inf inf inf inf inf inf inf 194 10 0];
; b j& V9 f4 H) S[D,R]=floyd(a)
q4 e5 F+ X1 B q: s# a7 W# Z% Afloyd.m文件源程序:
I( o+ s" u2 Cfunction[D,R]=floyd(a)7 K( m% j4 |8 W* M5 W; X1 c
n=size(a,1);
' \6 c" p0 C3 w# |5 C8 ^$ J) mD=a
- V. o: _0 l' w, Jfor i=1:n
: M2 a/ y1 y1 x& K/ v for j=1:n! N' U/ a" @. Q K5 S
R(i,j)=j;9 ^1 {5 O6 Y, i9 }4 G; e' `
end/ A0 V' S: b4 |$ i& U
end" w8 z3 u- R$ M5 [2 q( X
R
' ~; ]& o3 I% D8 h% d+ C, u+ J/ m9 Dfor k=1:n
7 l& V0 V# a. s6 L+ I# r+ o for i=1:n ]9 R/ \5 e" |: R& O3 S* T7 i. n
for j=1:n _- j0 {# v, U: k; D! D
if D(i,k)+D(k,j)<D(i,j)& [- _8 V+ M: q2 B& F1 F
D(i,j)=D(i,k)+D(k,j);" n- x1 @( I& a+ n- s' X# N3 k
R(i,j)=R(i,k);, C0 U B! ]0 t. u# S# V
end
) u' o9 i: t: [9 Q end7 t* Z) k) V0 Y7 F3 `' K9 {$ N
end+ J2 e3 b. W& [# x' Y$ x" X
k
7 i: }: a( q( t5 Z3 D! c D6 B; [2 z6 C# b( Z, V7 h
R5 A+ D% j! B( Y# E2 m3 ^8 s( G
end
' j1 Q. q# E* ~五.结果分析
1 f" X; [5 z# ~( w(1)Dijkstra算法8 c/ d# @$ j/ V1 n1 ~5 h- h
运行结果:$ k' r2 `( Y2 m8 k V( e- I+ l( ?
l = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812
! S8 ^6 G# ?" `z =1 1 2 2 3 4 6 5 10 8
E* o4 g4 S L) R5 t
3 k; Y+ r- i5 a) b结果分析:
5 \; f' P( p% o/ d: S通过运行结果: 到其他顶点的最短路的权 ,可看出,8 H/ y3 J; |4 R: k5 D2 ?, a, I
到 (即 到 )的最短距离为1812(km);
7 r( @6 A R5 B! {+ ], k 到 (即 到 )的最短距离为1618(km);$ x( k' Y4 Q' t7 }1 t
v: l' L( ^ b! Z3 b 到 的最短路径为:V1→V2→V3→V5→V8→V10;
! v" E, h) W, w 到 的最短路径为:V1→V2→V3→V5→V8。% v; _ a% S/ F& B7 j5 k: A6 ]
# N, H) Q) N5 w* j$ J4 \# C(2) Floyd算法2 f( P/ g) J9 O
运行结果:
( O7 i( _; ^) V' j& eD =
, G9 d; O; P* e* o3 N8 z 0 1200 1212 1402 1413 1422 1617 1618 1822 1812! J, Y. P% w p* w
1200 0 12 202 213 222 417 418 622 612
$ Z- Y6 U# L9 ^! H3 m" t( K 1212 12 0 214 201 211 406 406 610 600- R/ P2 T4 C6 Z$ [& f# r
1402 202 214 0 30 20 215 220 424 414
6 s* `4 }3 x* x% Z/ m& V 1413 213 201 30 0 10 205 205 409 3998 F3 }$ ~$ U; V
1422 222 211 20 10 0 195 200 404 394+ \: Z* Q9 t0 l% w: N
1617 417 406 215 205 195 0 5 209 199
4 W: v, _8 W( x, E8 { 1618 418 406 220 205 200 5 0 204 194
, H1 v3 M4 w& m) M 1822 622 610 424 409 404 209 204 0 10
' H4 y: j; N7 W/ d- | 1812 612 600 414 399 394 199 194 10 0' N. H2 I* `$ b* U" N! Q
$ ?0 e; y8 G2 j) s G" X
R =0 `- B; \2 L: V) |% t
1 2 2 2 2 2 2 2 2 2" i' T/ Z2 `9 L2 V' W
1 2 3 4 3 4 4 3 3 31 y$ t8 e+ }4 N; {
2 2 3 2 5 5 5 5 5 5
9 x5 W3 u# K+ i- V# J 2 2 2 4 6 6 6 6 6 6( t2 ]$ Z* ^) \/ Z) ?+ t
3 3 3 6 5 6 6 8 8 8& |4 ^. N; y9 F! B% {- G2 Z3 g0 U
4 4 5 4 5 6 7 7 7 7" e% p3 @* D4 ~4 ]
6 6 6 6 6 6 7 8 8 8; E5 G; @! x |& r. v
5 5 5 7 5 7 7 8 10 100 L' C. u% B; C6 q, Y
10 10 10 10 10 10 10 10 9 103 Q- R# I7 H7 U1 j2 u# T. d/ J* P
8 8 8 8 8 8 8 8 9 10; O/ P0 Q8 h. F
结果分析:
# C/ C' Z8 Q5 y) T( J通过运行结果:可看出,' L) G% d7 U& N/ \, G; A
到 (即 到 )的最短距离为1812(km);: A% `4 n" x3 M9 X
到 的最短路径为:V1→V2→V3→V5→V8→V10;
$ P ^2 P! U! }; R8 k 到 (即 到 )的最短距离为1618(km);, V( W4 f' s6 m
到 的最短路径为:V1→V2→V3→V5→V8。) R) w; o+ ^# n3 C' M, V& Z
' W# L' j9 E. H4 \8 X0 b
. r. i5 {0 c2 V) w4 @3 P. r) m
|
zan
|