- 在线时间
- 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]初来乍到
 |
最短路问题及其算法
6 o# s2 r. I4 v一.实验目的:7 y2 W/ A( l/ z! M, ?1 c! q
1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;& |( c- d' X! j' v% ^0 ?
2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.! C; o5 K* Q7 f" g) l
二.实验内容:
+ @8 C# P7 e3 z% {7 X- r要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).
& f3 Z% f/ G4 `- ]& c为方便计,1km主管道钢管称为1单位钢管.2 m' n. M& o" u n: s
一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:
3 R8 b4 z+ _ E9 x- S D1 i# Y: S
9 I2 P0 D6 b0 ]. X1 2 3 4 5 6 7
. ~; E# P0 S, a" b ^! t 6 ^, r0 L9 s5 d# M: H3 `- H0 g. `& p
800 800 1000 2000 2000 2000 3000% F' ^% i8 S$ E' ~
4 s( Y5 P2 g; \) g: G' U$ W
160 155 155 160 155 150 1603 `: w1 q' S$ D: u4 D" p, h$ T
1 N8 x9 L" Z# H8 [5 V( p1单位钢管的铁路运价如下表:
5 R. m$ B+ K7 d/ u5 i; U里程(km) 300
# D* B+ U) `( b8 @4 V; v9 Q3 S301-350 351-400 401-450 451-500/ q$ K2 ]* Z. o2 t. U2 l
运价(万元) 20 23 26 29 328 ^. f9 i2 x8 `' f
里程(km) 501-600 601-700 701-800 801-900 901-1000, f. f `& p( c, z% A
运价(万元) 37 44 50 55 60+ Z: ^# L; s3 X
1000km以上每增加1至100km运价增加5万元.' V/ i8 X! n9 V+ `
公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算). l/ ^) P& q3 \5 E7 l" M
假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.3 c3 ~3 p, ~1 B6 c3 d
, M& W* ~9 L3 N9 W& V试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.
( w9 ^4 E+ V' Z2 K% J三. 模型建立7 k# V6 V T# z# w2 c1 o
设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :
- }! q' \8 [/ R& m. Q( G. K# W " K. w$ ]% J! r$ z9 G- s K
利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离- p7 F0 ?4 g2 a f
, ^4 E9 G- `2 g' J9 x; B8 \1 c
解:先写出带权邻接矩阵:/ o4 d" P; P! b
; i& R+ W* ?2 H# f5 @4 `# s
后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .( C$ a6 x1 r- }! v' f
四. 模型求解(含经调试后正确的源程序)
8 B: e, o" V: `& n! N2 N(1) Dijkstra算法9 b! w9 Y3 j* p4 q& O2 G' W
road1.m文件源程序:
' _/ J) b- c" vw=[0 1200 inf inf inf inf inf inf inf inf;
% k' D. @: ?8 \4 G, h1200 0 12 202 inf inf inf inf inf inf;
6 f' f5 u* u: K- `/ R! O" `( qinf 12 0 inf 201 inf inf inf inf inf;
0 D1 C8 b' a) V! w; n, M+ o/ {inf 202 inf 0 31 20 inf inf inf inf;
' R0 R" o# _7 i' H) V) J3 Q9 U) {inf inf 201 31 0 10 inf 205 inf inf;
, l! ]$ N9 y5 C5 [inf inf inf 20 10 0 195 inf inf inf;9 ?8 k2 }, A9 E8 m! b# T3 |. j& U
inf inf inf inf inf 195 0 5 306 inf;1 f8 y k$ w" F# D
inf inf inf inf 205 inf 5 0 inf 194;
* H* I, @& J2 ^! C( jinf inf inf inf inf inf 306 inf 0 10;0 }' B5 h* m7 ~' w/ V0 b" {1 D
inf inf inf inf inf inf inf 194 10 0];
: j- M" _2 ?4 t5 ]! ?& W& ?n=size(w,1);
; Y5 M$ }/ q6 k7 B2 [w1=w(1, ;
: j8 S1 v( [8 R" Q& Ffor i=1:n' a1 o" `4 B* t
l(i)=w1(i);1 w0 f ^1 A5 U+ S$ |- s) @+ J
z(i)=1;
! \4 n/ T; h+ T4 _end: U9 F: F1 Q7 A5 N5 x0 Y* e
s=[];
8 U5 e6 |4 `: L* m" ls(1)=1;
( f: q. p% f" b6 qu=s(1);
& w6 w7 }# D- t+ g2 v) |- P# m$ |k=1;
' K4 _) f' X7 S0 l7 L1 jl;
2 y- I" u* z: {& U; [z;' J( K1 _( L0 u q
while k<n
0 f2 l2 l }2 B; l+ n8 c" y# H for i=1:n
6 r6 F- M9 \9 V9 S4 `9 _ for j=1:k
3 ^2 `9 \% r% M- o if i~=s(j)
/ @* y/ T; R" |% S if l(i)>l(u)+w(u,i);
$ x! x) q* C/ R l(i)=l(u)+w(u,i);, j+ Q3 {' X* W
z(i)=u;$ t. T. K Y; Z
end
( G- R/ Z5 t: b: g7 }# [ end
8 D+ |2 ^6 d2 D, W0 O end0 P) l) U$ x+ q- l" C& z
end
3 `: H2 z T2 z$ W% L; q1 Z! J8 Z l;
% c9 R7 d& z) k6 z- b3 e7 K3 l z;
$ v# d' B: J, ?ll=l;0 F" m( B$ V6 ^8 c* ]
for i=1:n
6 ?8 g8 `) E2 F$ v- U# s3 i for j=1:k
" K1 L3 p3 O, j2 n if i~=s(j)
/ | ?+ T# o4 H7 T ll(i)=ll(i);/ s8 S0 b: m" l. d6 `
else) W( _2 t- H% `; k o' }
ll(i)=inf;
" r7 F6 W! y2 Q, {! z end
6 }' c2 H7 Q# n. ?6 V: c4 h7 {1 g+ tend
E/ h- y" l3 v7 @' B0 ^end
9 `# p0 p' h U |lv=inf;
# w, Z/ K+ ]8 }" b1 E, R8 Ifor i=1:n
% K% c L2 p9 E3 c) m& P if ll(i)<lv
! E% v$ z! s+ K! e% u. G) f lv=ll(i);0 T/ k/ \) r4 C
v=i;$ X# z7 }. S) l, T/ ^; W1 i
end+ T0 X Q$ T6 c6 H! `& q" k
end/ {, r% Z; U. F% f# v& Y# L1 ]
lv;. y2 i2 D# q; }/ ? y
v;/ p# `$ T1 u, C9 R/ T" A) J
s(k+1)=v;7 G1 \- F# ?9 U; V& y/ K1 d
k=k+1; R# k" N6 ~1 @1 q
u=s(k);
9 s3 H7 |, q% t2 K1 xend
/ ~( b0 J1 ?! b- V* Xl
8 U8 C1 }3 f# S' _. oz
9 g: S. A3 w& a
1 B, U8 u# e& L V% Q! u. |* g(2) Floyd算法# r% l1 ~" H( J% t; ^
road2.m文件源程序:2 y6 V" Z1 J: k4 A' \3 u0 `' v
a=[0 1200 inf inf inf inf inf inf inf inf;
9 G9 S8 z- K$ ~9 d9 c6 C1200 0 12 202 inf inf inf inf inf inf;
v) [! ^! C! o: {" Cinf 12 0 inf 201 inf inf inf inf inf;
2 _. m2 X9 w3 u2 I3 R, @inf 202 inf 0 31 20 inf inf inf inf;
) w) H r6 U$ j; Dinf inf 201 31 0 10 inf 205 inf inf;
1 M) v+ {7 b: e; p& t! O8 \inf inf inf 20 10 0 195 inf inf inf;
* f- I3 u1 `+ Q$ Q3 B# iinf inf inf inf inf 195 0 5 306 inf;/ r' I# t' g) d4 z: Z
inf inf inf inf 205 inf 5 0 inf 194;- Z7 e U0 v6 W" B0 d8 z; u/ E; J
inf inf inf inf inf inf 306 inf 0 10;' R! h3 @; x! u0 ]. J' n3 { U) t
inf inf inf inf inf inf inf 194 10 0];; j4 q" q8 f% o- B) g
[D,R]=floyd(a)' @6 d+ T1 J; T( [; S
floyd.m文件源程序:
0 }# z9 D% X; J' x; Nfunction[D,R]=floyd(a)3 a8 a8 }9 a+ Y6 {; K
n=size(a,1);
6 N. J9 ]! I! O" a2 yD=a7 v' v* e m; J. Z1 A
for i=1:n
! f: S; I) E4 b for j=1:n" P0 I4 p* A; F0 y0 H
R(i,j)=j;
1 p) \/ s$ @! g4 k! B# X: Q( g2 k end
- h' _6 a( n: L u8 Zend7 ?- H9 D! a4 W9 x, o& C
R
2 e) y" {# b( Z: y% v: ifor k=1:n3 j1 ?* y, u3 a: A
for i=1:n
# a* V- a4 H; j! \4 J for j=1:n
: E; \* L8 M. ]& F. g G if D(i,k)+D(k,j)<D(i,j)2 G& Q& p3 l3 m/ {" U/ Y6 _
D(i,j)=D(i,k)+D(k,j);* R+ ?/ w$ C! C1 I7 g
R(i,j)=R(i,k);2 t/ H2 R- }* O+ w- i
end
, S" \: s: S# r end
$ A# D5 V: E% ~8 m8 i) s end
: C% `' W" P# d" h2 [/ m k8 b, f- b/ L. b! @2 E; t( \
D
; R" H( D# B' \2 w5 v" I* ?3 a R
) q0 j( Y! y2 k. h1 w+ x: @end
# ^3 K- N; z$ A! u' s五.结果分析
; o* A& K. N/ o$ j% N9 E(1)Dijkstra算法
$ \/ N2 o( g0 ]' o运行结果:
$ ?) u3 x, Y# A4 Bl = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812
w( e& ?0 B% ~+ Qz =1 1 2 2 3 4 6 5 10 8
1 _3 Y6 Z# M/ e
/ X* r1 ?! G1 {结果分析:% r" k' k0 ], X2 X) j0 d% K; U6 o
通过运行结果: 到其他顶点的最短路的权 ,可看出,9 _$ D% p' [. V4 o2 H
到 (即 到 )的最短距离为1812(km);
) [7 l, ^" H; F4 Y. T3 g 到 (即 到 )的最短距离为1618(km);" A6 z/ Y/ [1 C/ o6 U
/ h! ^+ u7 s Z3 o) O* B 到 的最短路径为:V1→V2→V3→V5→V8→V10;0 v, U7 q0 L1 U& `3 C8 q: k9 t
到 的最短路径为:V1→V2→V3→V5→V8。) V# h; X2 f! g4 c$ }
/ _; i2 J, T8 U; u
(2) Floyd算法8 O6 g9 Y4 Q! f
运行结果:
' Q/ t$ C! L: {& n4 ]/ n& X5 _$ J, yD =
]8 `* v! B% u& L1 c& W 0 1200 1212 1402 1413 1422 1617 1618 1822 18120 h5 l) b( p9 y9 L. [
1200 0 12 202 213 222 417 418 622 612
% }* ~: b8 D y0 \ w 1212 12 0 214 201 211 406 406 610 6004 U" T* A7 O7 `& X6 r
1402 202 214 0 30 20 215 220 424 414
! B: B! {6 F& U( F! z 1413 213 201 30 0 10 205 205 409 399
& ^& O! N% D( ?, J4 [( L1 l; T 1422 222 211 20 10 0 195 200 404 394" ~! X4 s8 G) O
1617 417 406 215 205 195 0 5 209 199
, {9 w& b' ]" E2 r8 _8 M, P 1618 418 406 220 205 200 5 0 204 194
+ F% \7 k5 @# k" Y, \ 1822 622 610 424 409 404 209 204 0 10
4 G) w- {4 O- \' r" z) Y2 }/ Y 1812 612 600 414 399 394 199 194 10 02 I' ^4 I0 h( g& j
0 o" S. f$ i4 \% f: k# X2 \# H6 u
R =
: ^; p3 N# f) D" N B 1 2 2 2 2 2 2 2 2 2) I0 ^! y2 }* B" E3 T
1 2 3 4 3 4 4 3 3 3
$ C5 v' s& M, S# K/ I 2 2 3 2 5 5 5 5 5 5
6 y) k, M. M) D. y6 ^ 2 2 2 4 6 6 6 6 6 6+ j5 y& h* K' h1 S* v* J; B
3 3 3 6 5 6 6 8 8 8; n7 [, q0 |$ C C; |# t! M
4 4 5 4 5 6 7 7 7 7
+ x- t+ D% U7 R1 X7 o 6 6 6 6 6 6 7 8 8 8 T( q$ l; X7 e k% i1 {
5 5 5 7 5 7 7 8 10 10
/ @- I: ]% d8 e 10 10 10 10 10 10 10 10 9 105 @0 \7 q0 ^( z7 f$ Y
8 8 8 8 8 8 8 8 9 10
7 _7 [( f$ D: |1 w6 ~5 ^结果分析:7 w: A/ N- H' e7 U3 W! u
通过运行结果:可看出, [# \0 M' g2 s$ f$ J7 Q
到 (即 到 )的最短距离为1812(km);
+ a% o# a) f" n& I 到 的最短路径为:V1→V2→V3→V5→V8→V10;1 Y$ }3 f6 t9 X" S$ S
到 (即 到 )的最短距离为1618(km);2 [( a% j: H7 F, C2 {; d/ |8 X
到 的最短路径为:V1→V2→V3→V5→V8。
" M% {" G5 B; G3 u+ f; k; I
9 z' l& B( p7 Z
) Q6 d! B5 W. I- z \3 S) e |
zan
|