- 在线时间
- 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]初来乍到
 |
最短路问题及其算法0 C: W% J1 L4 S* D
一.实验目的:
, t6 {2 |2 O" ]3 k* O u1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;; h" O H* G$ h+ x5 M+ t7 }
2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.
9 `7 A" p; w% X, H3 d二.实验内容:
! ~) }! G8 Y4 V" i Z要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).
7 d: ?' \" d1 y0 f. R( N为方便计,1km主管道钢管称为1单位钢管.
2 g+ h, Z, B2 P& U1 l一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:
0 K1 d4 P0 \6 p5 l' e. a ' x8 x! s$ p8 g N1 e
1 2 3 4 5 6 7
& R7 q" p- }* a" ^& i" Z7 w % T$ d$ Y" P2 t: w9 Z4 n$ K, c
800 800 1000 2000 2000 2000 3000
1 t# S b5 V5 O 6 a( S0 s, p: e0 j( P
160 155 155 160 155 150 160
5 T7 B u2 K- y7 p/ D9 g5 {0 H" {7 l; T0 H' ~
1单位钢管的铁路运价如下表:
4 }3 Q9 p2 ^5 |* Z' A( S里程(km) 3007 s5 r8 d% U! U" x( A6 g; i3 `' p% l
301-350 351-400 401-450 451-500
7 b- U' r! D M4 U! @* }) {运价(万元) 20 23 26 29 321 w4 b; x% D, e/ W7 a9 M s
里程(km) 501-600 601-700 701-800 801-900 901-1000% n& z) {/ u! v1 k
运价(万元) 37 44 50 55 60. l/ ]/ S% L" r' ` I
1000km以上每增加1至100km运价增加5万元.
/ H- d, R m0 X Q$ K$ M- h* q7 E公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).
. t) B' u' Q2 }6 n6 f$ B( ~+ V假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.
; h' \7 o5 K2 V4 x- Q+ Z. n
; c* Q8 d# x) U- ^1 L% {% M6 B试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.
+ o; a+ I# n& u$ |% K9 B" k三. 模型建立: p8 ~$ q" ^: y4 j
设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :! c5 X- N* {5 Y5 d; f! Y$ |
- D6 N+ p- R- |8 {" N, K
利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离
- ]3 f \; S; [7 D/ E' [( ^9 | v% g! h. X1 \. w6 Q
解:先写出带权邻接矩阵:
+ C) e: S/ g e
# Z9 l }2 G7 V( y) \0 {后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .
- ? v! Q) L6 o. m# i4 z3 ~四. 模型求解(含经调试后正确的源程序)7 E1 ]; n) ]3 ~/ P) i/ Q
(1) Dijkstra算法7 [( e. r% C% G3 P8 U; k
road1.m文件源程序:
( \1 A+ z0 k+ rw=[0 1200 inf inf inf inf inf inf inf inf;
: V9 {+ M3 W. i A0 J/ V8 R1200 0 12 202 inf inf inf inf inf inf;
' w- X6 l3 L$ F3 N$ Jinf 12 0 inf 201 inf inf inf inf inf;
3 O% N7 Z/ B( E' Ainf 202 inf 0 31 20 inf inf inf inf; m7 D3 ]& x: w1 l
inf inf 201 31 0 10 inf 205 inf inf;
- h) \6 w" S- {7 ^" m8 B+ ~inf inf inf 20 10 0 195 inf inf inf;) W- w* A& ]1 H2 c4 ` o! S6 {* Z5 m
inf inf inf inf inf 195 0 5 306 inf;
8 O. G+ {) s5 r; d1 einf inf inf inf 205 inf 5 0 inf 194;1 O7 T. W! Y c9 X4 F4 U' U
inf inf inf inf inf inf 306 inf 0 10;, v0 B- U7 }+ q4 U. h) z
inf inf inf inf inf inf inf 194 10 0];
2 \% T& R- P# `5 N7 X* ?n=size(w,1);
% U. W% G P6 g0 p2 p- {7 {/ @w1=w(1, ;
J, F* E7 v1 C3 @& r/ f8 sfor i=1:n: x0 _" K( X' H m2 d" w
l(i)=w1(i);
& P- ?/ V0 U \) p: b0 |1 ?6 D; N z(i)=1;$ O }+ i1 I8 h! H& ]
end
' Q. \7 A8 ]9 U9 j. @- e( @s=[];- S+ O* S' |: C/ x( W A; i9 K& Y
s(1)=1;0 t0 D% f$ q; e9 M; g
u=s(1);, v8 O. i$ U' P, @& q. p Y* |# `0 C
k=1;
& {) _' ? E/ e- @3 zl;
9 z) w$ z' Q4 U/ \8 fz;! f: _& k4 u$ `2 o* C W
while k<n! ?& ], e! r5 ?( e0 I0 J: \5 C+ ?
for i=1:n4 G: D3 V0 S8 g$ H4 w5 {+ r
for j=1:k
7 C# o+ P# K+ A, a if i~=s(j)8 E" b+ @+ k0 ]! F Y) y9 w
if l(i)>l(u)+w(u,i);
8 G, |& [: g6 o. z! ?7 Q' N l(i)=l(u)+w(u,i);
8 b" s0 u- ], @. Y+ r, S4 i- \' l z(i)=u;6 S6 u# F2 v9 Z4 F
end
! A' }; ]+ K* w2 b# N L9 F" T" | end
# k: ~( \' g+ A( q end
9 p: n8 G, \% z/ c& send' r+ u8 t9 G$ A% d" B' \- L$ }
l; |# K1 u- U% T
z;3 `0 |4 }3 P0 s- A* R+ H
ll=l;
& Z* E" }! W; `. p4 l for i=1:n
0 P( _! j7 s' J for j=1:k* g/ {. M. d e% ^ g7 e, |/ D
if i~=s(j): ?; P% j m2 i) c$ u
ll(i)=ll(i);1 w# l L2 w b
else! n2 E5 m" ?) f; K$ ?
ll(i)=inf;, ~* J8 _" c* U
end% b, E0 E- F1 l8 D
end* l( X4 G# i# [5 Y
end
9 {( z0 _' x$ y2 p, G+ Ilv=inf;
1 y( A4 H( {, R% _; w. Hfor i=1:n3 E5 t$ F1 M- W! G, _1 f
if ll(i)<lv" Q: N& i1 ]0 Z) J
lv=ll(i);
* Y- l' u9 ]" @8 d v=i;7 N8 @8 L" T% _+ e+ x& h2 x
end4 }! V3 y O, Z, @0 K0 y
end
+ V0 w5 p" T& _8 }) Alv;
* h& m# R* j k- D( F) f+ p: V C+ wv;! r! R9 { q5 W) u: i- F6 e
s(k+1)=v;
7 H0 C. l0 h) Y7 L* dk=k+1;, n) g6 E9 W! G( y2 p- m
u=s(k);
0 ~) i: R( J& l. _$ Y6 y! rend1 h5 l& m3 r, Q7 p( }# n$ F, U
l) I0 c2 G/ r0 z) `
z
* P; C6 {/ d" n+ r9 H' Q# k/ c. \! B/ p
(2) Floyd算法
. U4 b; D" x! n4 ~# k* Vroad2.m文件源程序:
- j( y" @9 p1 ga=[0 1200 inf inf inf inf inf inf inf inf;) {: D8 W7 J4 N" g3 s
1200 0 12 202 inf inf inf inf inf inf;
5 s6 i$ X( p6 E3 R6 G* g- f# j; Y% }inf 12 0 inf 201 inf inf inf inf inf;
3 ?- j+ N* c, c8 B7 Finf 202 inf 0 31 20 inf inf inf inf;
; _; ^, @8 A' Linf inf 201 31 0 10 inf 205 inf inf;/ a" S: S; u6 [! }# }
inf inf inf 20 10 0 195 inf inf inf;6 _+ I' @9 l' m8 I: V
inf inf inf inf inf 195 0 5 306 inf;) z ~* J! b3 r' w: j7 |# c' }- u/ K
inf inf inf inf 205 inf 5 0 inf 194;: q* ]1 m' X* I* [; s" U
inf inf inf inf inf inf 306 inf 0 10;
7 e- j9 `6 }6 m9 N9 N7 D4 xinf inf inf inf inf inf inf 194 10 0];& o8 Y2 l; p% i- I- |
[D,R]=floyd(a)
, y' G3 B0 a2 ?* h( C7 L' b* ]floyd.m文件源程序:
4 I0 R* d" c5 r U3 dfunction[D,R]=floyd(a)
. c; U% |2 f5 Qn=size(a,1);
+ b) c' ]3 }) w$ d6 z7 o' vD=a
: H. r. R1 a9 p3 o2 [for i=1:n
7 l k9 X& A( A1 N0 l, V for j=1:n E! X: l8 O" s0 @
R(i,j)=j;' y0 a, J/ J& O. F
end5 | H* a( ?2 J1 V& S' Q
end
; b4 V& z7 I7 [+ dR
, w4 {! t3 i" Pfor k=1:n
8 ]# Y3 ^; Y2 B1 S8 Q6 r for i=1:n) X$ `8 X# Z9 r0 O3 ?- A- {4 W# ]
for j=1:n* r* F" f4 V& {5 L: L( o
if D(i,k)+D(k,j)<D(i,j). F* R1 w! i1 `) p# h
D(i,j)=D(i,k)+D(k,j);5 q3 U$ R2 A2 o) ~8 f
R(i,j)=R(i,k);
- A' X2 |# n t8 S! q end
2 [) a- e1 M( P end
9 A% T9 ]" Y' u! ^- y, \1 i, j9 s end
2 \& x. ]# r$ P- R- v' x% f5 k k
9 Z0 r8 w% e. a, @ D
. A8 z _* r% ?6 J! N! t R
i8 _) a" [) u) l/ B, g/ W/ bend
8 _' X# q# m& V* L7 F五.结果分析* t4 r+ Y7 w- G ?8 W& z
(1)Dijkstra算法" z/ } P2 g! T. i# G: q6 r
运行结果:+ G! R4 X; ~* m5 s
l = 0 1200 1212 1402 1413 1422 1617 1618 1822 18126 q' `: i; D3 A3 K/ q
z =1 1 2 2 3 4 6 5 10 84 U6 b/ k0 f/ ~' E4 H: V
9 T. K. O8 y* v+ D: j
结果分析:) Y8 j" \8 R, r( T) ]
通过运行结果: 到其他顶点的最短路的权 ,可看出,
) e" I' y& t' w/ T* a6 ]; J 到 (即 到 )的最短距离为1812(km);
! v& J5 ^3 v8 z! [- I# O) { 到 (即 到 )的最短距离为1618(km);; x* O2 R4 G- q/ \
9 C* c$ y7 o6 g
到 的最短路径为:V1→V2→V3→V5→V8→V10;% M( F2 @; P, L# C# z3 ^
到 的最短路径为:V1→V2→V3→V5→V8。
+ h4 O* ?+ |9 y. h7 F/ J8 B9 Z9 [7 ^$ D+ R( b) y& [) A9 ?
(2) Floyd算法
! a1 i. I, `7 {3 ]4 A运行结果:4 k2 ]. F2 M1 k6 U
D =3 G7 C. c" v6 U. b5 t. M
0 1200 1212 1402 1413 1422 1617 1618 1822 1812+ r9 b0 W" t! ?8 j( y
1200 0 12 202 213 222 417 418 622 612- r3 I) d# E! X* D* \' U
1212 12 0 214 201 211 406 406 610 600. m/ J" o4 O! w' i$ S
1402 202 214 0 30 20 215 220 424 414 q9 g! [1 k' R& f
1413 213 201 30 0 10 205 205 409 399
& W6 a, j: C5 j$ b+ I# t 1422 222 211 20 10 0 195 200 404 394/ e+ Q. d0 f' T
1617 417 406 215 205 195 0 5 209 199
& x1 F' q( t0 i3 K5 M: S6 \% ^ 1618 418 406 220 205 200 5 0 204 194
* o9 f2 w- K' d4 s( N2 P 1822 622 610 424 409 404 209 204 0 100 G2 n5 C0 p4 `* O* U$ |& o0 E
1812 612 600 414 399 394 199 194 10 05 ]9 y$ l0 k* E$ Q7 c, \5 i
, F ]- M1 d. z- Z( L
R =
* T b7 A# I1 i9 H4 S 1 2 2 2 2 2 2 2 2 27 G& k. O! ?) x) C
1 2 3 4 3 4 4 3 3 3
6 w3 v, C" Y5 T! p 2 2 3 2 5 5 5 5 5 5
$ F4 g5 y. n. x 2 2 2 4 6 6 6 6 6 69 s6 S) L: m6 b6 E3 D9 b
3 3 3 6 5 6 6 8 8 8
' }9 f+ g' d5 R# w& } 4 4 5 4 5 6 7 7 7 7# A+ |' F* W- C5 t% H
6 6 6 6 6 6 7 8 8 8' i! O" k$ g& e- }9 w9 S
5 5 5 7 5 7 7 8 10 10: Z! k0 s! E R, ?
10 10 10 10 10 10 10 10 9 10- O1 I) a9 x" I! s
8 8 8 8 8 8 8 8 9 10$ l6 _& l0 u3 L1 O( H9 L
结果分析:+ t/ r/ I% h$ K7 Z
通过运行结果:可看出,
) F! C8 q) r0 L7 Y, o. P# X 到 (即 到 )的最短距离为1812(km);
4 c4 X6 m0 p- p1 | 到 的最短路径为:V1→V2→V3→V5→V8→V10;
& v3 i. U$ Z* |/ x2 ?% }! v; }" v 到 (即 到 )的最短距离为1618(km);2 i1 g# g* F Y
到 的最短路径为:V1→V2→V3→V5→V8。) E0 b2 g) _( o R. S7 p
, P/ Q5 c' J% V) a! z
& Z" P- m' s! c* @& e1 Z! J |
zan
|