- 在线时间
- 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]初来乍到
 |
最短路问题及其算法5 ?% i u1 x2 a: l, B E6 S
一.实验目的:
?3 u7 \ a1 m- {" S1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;
. ?( U# F9 `1 B% l n) y2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.
& w) ~9 f+ ~/ n) K3 e* R( w, Z二.实验内容:
0 S7 @# P8 T8 j/ {% y& n7 a要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).
7 p* ?% p' C3 H8 Y1 Q3 X9 ]为方便计,1km主管道钢管称为1单位钢管.* x) |- O2 I) h1 `# M& K
一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:
$ W. n4 e& G6 r+ s& j+ n
& M) Y# N: n( P/ M& H. l1 P2 o1 2 3 4 5 6 7
9 `' H+ x: H2 V4 @& A
; P) e6 G4 i* W7 f7 e. D/ a800 800 1000 2000 2000 2000 3000
. [, n4 N9 {1 C1 X$ L
# Y# S4 R6 j0 B( W7 w% a% L160 155 155 160 155 150 1609 [: F3 A$ z/ j+ D5 [
* Z! |+ s3 S+ Y6 p5 b, m1单位钢管的铁路运价如下表:7 V8 t# J9 ]1 W: o% T
里程(km) 300
& a7 E% b9 T7 h8 I3 T301-350 351-400 401-450 451-5001 x: d: L) s; D# {6 t
运价(万元) 20 23 26 29 32
* W! }! ]1 y- M9 j: h$ n里程(km) 501-600 601-700 701-800 801-900 901-10004 |8 `& l# g( j T, H) m4 W
运价(万元) 37 44 50 55 60
; L1 h4 T: D- r. y1000km以上每增加1至100km运价增加5万元., Z! A' y& v6 \% a6 U h5 d- ^
公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).
* A. Z- ?) X) h% E9 s* U$ g$ a假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.
9 ]8 F4 J+ F) d" f8 G; O
% Y# g4 o0 P% q5 t9 A/ Y: A2 |试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.
" I$ R9 D* w9 S" m$ E3 J三. 模型建立1 C% d1 y# A# z* S& b
设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :
+ W" u& Y* K t X3 o! w* J
: J O) x8 X/ i4 k( c( s V8 `利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离
0 F# Q3 u# ]( X. q J ( p0 _2 Y& p. M# z- h5 t* ~" p+ ~6 b8 r
解:先写出带权邻接矩阵:9 d7 L% v- e) R0 E. m9 ^
' x3 V, j* H. C+ d后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .
, b y! m0 [$ `0 a( t% T y& Y四. 模型求解(含经调试后正确的源程序)% ]+ @, C, X* ]; S
(1) Dijkstra算法* }9 w" o. @* v# s% D1 }9 _
road1.m文件源程序:
% e& E5 z& [$ yw=[0 1200 inf inf inf inf inf inf inf inf;8 [; K% W5 N4 w* Q0 L
1200 0 12 202 inf inf inf inf inf inf;; D6 i& X( c3 W3 Z" b8 z# y
inf 12 0 inf 201 inf inf inf inf inf;
+ z/ F$ Q$ C/ y! [$ a& ^" _inf 202 inf 0 31 20 inf inf inf inf;
; Z3 m& P4 g& N2 g: k! Z8 z! q- Yinf inf 201 31 0 10 inf 205 inf inf;1 T8 e5 j* y/ O' z: W
inf inf inf 20 10 0 195 inf inf inf;
O7 j/ o. e7 x8 I5 }* |* p, Uinf inf inf inf inf 195 0 5 306 inf;
3 P: {0 n+ B- K" _4 D4 C" iinf inf inf inf 205 inf 5 0 inf 194;
7 ]- d$ u4 v0 H% h2 rinf inf inf inf inf inf 306 inf 0 10;
% p2 X6 b! G) S; Ninf inf inf inf inf inf inf 194 10 0]; 9 k! x6 N; q6 S6 h4 ~5 Y
n=size(w,1);
4 t3 [ q3 b# _6 ~. Jw1=w(1, ;
* P, T' R0 A8 s* F, Cfor i=1:n. i( E1 G" r/ a
l(i)=w1(i);
) V- h; @ H# H7 c! ?6 G z(i)=1;/ R9 B" k* j+ H6 v# S
end
( l- | C% a2 g# b ]" xs=[];# N" @& P+ N4 H6 u! J$ y
s(1)=1;
1 G% E: d1 D2 q3 ?4 o& @1 y# S7 Pu=s(1);. V2 ^7 ]/ G i' O$ S* [
k=1;
" b+ N7 h8 S! b" cl;
% n" _5 d1 P$ _7 Kz;, ^; e& C B' a# F+ g+ b
while k<n1 M X6 p& r$ p3 L3 _ |! Z
for i=1:n+ b! h' r3 I0 c: F! f" e X/ G
for j=1:k
) N4 L4 i5 m7 `. h A if i~=s(j)- u8 l$ N% ^ A6 V; d7 k! g
if l(i)>l(u)+w(u,i);
' l7 O+ m; Q4 }* ^ l(i)=l(u)+w(u,i);
" n* q2 v3 c0 Q# B1 k z(i)=u;
0 o7 Y. u( t; L* n; l# J end
! y7 |9 t; v" j; n: Z3 d end
& ?: R" Y7 Z+ f/ F* Q4 @; ]; n7 Q end
- Y4 E, J0 t7 k+ ` X# @7 Send6 I4 ?( M6 w1 q% W. z) H
l;: @4 |1 C/ u9 u/ z# G, p; s
z;0 v! L1 `& h: U( f- a
ll=l;
; x4 [# f! t; F. } for i=1:n
7 t- D4 p b7 Y( Q# n* { for j=1:k: A u- N6 s, a5 b+ Q
if i~=s(j)4 M& `* ~% G2 e' E
ll(i)=ll(i);% s7 U6 `6 Z% K4 S& W/ w5 }' D+ w
else
3 s, G: g: G9 Q ll(i)=inf;) E3 o( C* m7 o$ f1 m' P& V! Q
end( }( O0 @2 y5 l7 w. `6 P! p6 b( E
end1 p8 ]' R2 T+ D8 j
end
- F" G4 Q' K" c! n2 p# \$ Zlv=inf;7 Z; U; u1 ?$ r* A% O# w
for i=1:n' |$ I) `& ]6 n- [/ G, r6 e
if ll(i)<lv
2 N/ N- y* U' [, u/ D lv=ll(i);
# D9 \3 |' R% z/ o6 V v=i;
' [8 U' e1 C) L. ?1 l/ j end
( @) k$ c- a3 D2 T4 Qend
! D- Y8 N; H7 k: m, w# _lv;0 _2 B, D5 o+ {5 o
v;
$ ^% S+ p+ N& O; T0 vs(k+1)=v;
) ]/ _: I' r6 x/ mk=k+1;$ m$ ]( \( l. D! G
u=s(k);, b/ ^- N6 B8 J; L! T- q4 w
end9 m; O4 a1 X$ ]2 }. [
l
" m0 d9 Q% A1 N( f, ^z1 T0 i4 K' R* {/ K6 S
' E) i0 W$ ^" T& J(2) Floyd算法
! ]& V5 s7 U6 x( qroad2.m文件源程序:& u) O+ b3 B( z& u; K- e
a=[0 1200 inf inf inf inf inf inf inf inf;
7 i5 N4 V% b' d1 e' {# ~; H1200 0 12 202 inf inf inf inf inf inf;3 @8 u' H: y- \
inf 12 0 inf 201 inf inf inf inf inf;
' B8 c$ C; R6 K/ [2 |6 Finf 202 inf 0 31 20 inf inf inf inf;
T4 e8 `" }; e" x- kinf inf 201 31 0 10 inf 205 inf inf;0 p* x" `% F$ P2 N; P$ |
inf inf inf 20 10 0 195 inf inf inf;
; r) i& E0 W5 Ginf inf inf inf inf 195 0 5 306 inf;
! P' y& u: o# r, Rinf inf inf inf 205 inf 5 0 inf 194;6 H- H" x) I' e2 B5 z% y
inf inf inf inf inf inf 306 inf 0 10;
9 ^" ?3 d' l. L, Q! o/ Z! [+ W( Winf inf inf inf inf inf inf 194 10 0];: H0 v+ ^* `/ F8 f1 r; }/ p
[D,R]=floyd(a)
1 k5 ~" G( y) m2 T6 bfloyd.m文件源程序:1 s+ T. E& O7 Z n% ^
function[D,R]=floyd(a)* {0 y8 G7 A/ w( H3 q
n=size(a,1);
9 @ y4 \. b$ n" M6 ?0 |: _5 m5 E: j# {/ ]D=a' }, u% }; f! J* y, ?. b
for i=1:n+ p0 k! }& c* y( C
for j=1:n
' T/ c0 f! K8 ~/ r" `0 D! D! M* E R(i,j)=j;% `/ j1 Q( E5 Q. ~& M
end7 D4 k* V+ d8 }2 H& y6 S1 L
end; j8 f' P" M) z* U
R/ F2 o5 f9 o" F+ v9 k& f
for k=1:n
h+ a+ l7 J. N7 b! F for i=1:n
9 d0 a0 D0 V; h0 ]$ z1 ^( q/ S( c J" w for j=1:n7 v/ {1 ~" M% W
if D(i,k)+D(k,j)<D(i,j)/ A9 n- E# w# t; y
D(i,j)=D(i,k)+D(k,j);
! _+ i& U8 y1 ~8 l R(i,j)=R(i,k);
, a1 N+ s, _' m k; o end
9 D5 a# @' k, r6 [) y( h end
) R& V+ @( C8 ]- M$ @5 X, ^0 c5 C end: X) X$ Z, E& |; T- e2 P
k$ m+ c$ C! I5 p. j6 B
D- [4 R. Z$ F! k6 z# s& {$ }% S
R! F2 {/ Y' n$ R4 a% n3 y
end5 c/ ^' y: B9 r
五.结果分析
$ N. R3 {2 U7 k* ^5 H) ?(1)Dijkstra算法, p9 |: m- R' H0 {
运行结果:
, p, W# U8 @( T3 z$ xl = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812
l% }3 K' W( j+ P% T% G- q9 `z =1 1 2 2 3 4 6 5 10 8
2 J% h7 m3 { Z- e
3 v) J2 Z7 K; M& c! h结果分析:* j, g( A, [$ ~/ R
通过运行结果: 到其他顶点的最短路的权 ,可看出,3 V- \0 L% K2 ~7 S
到 (即 到 )的最短距离为1812(km);" k4 \/ _ O/ @6 p& V
到 (即 到 )的最短距离为1618(km);( i; Q/ J$ [3 Q" ~% `% P+ \
& I9 W" t8 Z" ?! d0 r
到 的最短路径为:V1→V2→V3→V5→V8→V10;. K b" P- Q- C8 T. ^4 k
到 的最短路径为:V1→V2→V3→V5→V8。9 H6 A; a2 [& j. ^4 d
' @7 v( S# b' _' l6 ~( T(2) Floyd算法
- f) o4 K% \ l s运行结果:
* G7 y6 J- a! D0 [+ S' r7 e8 pD =
( y n. b# ]2 U$ ?; _2 h& [8 G 0 1200 1212 1402 1413 1422 1617 1618 1822 1812* t+ X3 S' C' t; C
1200 0 12 202 213 222 417 418 622 612
. b% t# _- m0 _2 w. ? 1212 12 0 214 201 211 406 406 610 600
# X0 ~* ^, f, Y 1402 202 214 0 30 20 215 220 424 4143 j% N+ k* k+ \4 D$ w ~4 I6 n+ b
1413 213 201 30 0 10 205 205 409 399& N) T! k4 B# p7 y0 S
1422 222 211 20 10 0 195 200 404 394
4 g4 |1 W7 ~/ T$ U/ i+ c" U/ G, R 1617 417 406 215 205 195 0 5 209 199- x( d/ V) [2 o& S$ p0 u9 Z
1618 418 406 220 205 200 5 0 204 194
: M* [$ F8 }7 ~3 Q0 C6 }+ x" ` 1822 622 610 424 409 404 209 204 0 107 L! J2 f$ H i* o; j
1812 612 600 414 399 394 199 194 10 00 ?( Z* D$ U7 ~5 P3 d
. T# U5 P! r4 b& r N; C) [R =
( b+ X7 ^4 e' h 1 2 2 2 2 2 2 2 2 2
) O5 K j$ M- `) W1 R$ g, C 1 2 3 4 3 4 4 3 3 3
7 C! @; U5 M7 T5 X+ u8 | 2 2 3 2 5 5 5 5 5 5
# D" x4 v, W$ m. i( d1 R 2 2 2 4 6 6 6 6 6 63 z/ a) _8 T$ n& F4 B
3 3 3 6 5 6 6 8 8 8
, ]) m6 `! [& u4 r' @ 4 4 5 4 5 6 7 7 7 70 L$ i) m# f! g6 Z1 ~; W. N+ O
6 6 6 6 6 6 7 8 8 8- p$ @8 A' i+ u g. G. o* }" C
5 5 5 7 5 7 7 8 10 10
0 W- i3 W5 g) e+ ^ 10 10 10 10 10 10 10 10 9 10 H+ ~7 W: h' [- q- e! |% t
8 8 8 8 8 8 8 8 9 10
# c% p) z, e8 q结果分析:4 I5 G" V" E5 \
通过运行结果:可看出,
6 `) \& A- L( b1 i6 f3 F 到 (即 到 )的最短距离为1812(km);
9 J( V/ v; w5 S2 u9 Q 到 的最短路径为:V1→V2→V3→V5→V8→V10;
7 F5 n I* g" H3 t7 g 到 (即 到 )的最短距离为1618(km);
. Y* H, z0 ?. X2 G4 u4 G 到 的最短路径为:V1→V2→V3→V5→V8。- a' X4 w7 g! @! q7 g* ~
2 H$ K- L% e# \
4 J! a2 d6 J# T) Z2 B
|
zan
|