- 在线时间
- 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 y! H; s* h5 W. U9 y2 V5 H
一.实验目的:; @# P& B4 w' N* j! ]! P* i
1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;6 w: T; [# y5 H/ B% d0 K/ Y' f
2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.; D# }; [; w0 H0 _" F/ m' A
二.实验内容:
% f3 @( ]0 J4 I5 z要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).* v4 \3 e3 H' j+ q2 J
为方便计,1km主管道钢管称为1单位钢管.6 S1 E/ G# v3 S2 U+ J% ~
一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:
* G+ ]: }6 T+ Z! }9 [9 ~ 2 M l" ?3 E' X& y% X. P4 y
1 2 3 4 5 6 7
1 i! t4 U' R0 Y% d5 }$ C ' c8 H: r3 |) e: k& _- O4 T8 s
800 800 1000 2000 2000 2000 3000
1 i& s2 Y7 {; z2 H5 f- M 1 f8 v) z9 e) o: q
160 155 155 160 155 150 160
0 y: v" q. J/ W k; f3 Y
! n% S9 N. q2 `, b+ }0 M* Q9 [4 k- C1单位钢管的铁路运价如下表:" ]0 C& ^! o' G) U, q
里程(km) 300& ?& M' r( `; [9 q' J
301-350 351-400 401-450 451-5006 C" H# ]) h3 X: }4 n( R2 Q* `% I
运价(万元) 20 23 26 29 32! Q! V+ X8 J1 T/ l! H. C
里程(km) 501-600 601-700 701-800 801-900 901-10006 n) V$ V6 [; z2 u! N
运价(万元) 37 44 50 55 60
+ F! B! \3 Z% p$ t! J" N7 A4 H* y1000km以上每增加1至100km运价增加5万元.
- P- ~4 f4 n# F公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).
/ z J$ @2 z* K假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.
1 d" h9 C8 F6 c6 ?2 I5 t + C! u1 o; j I. e
试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.
- k. \; s. K8 |. A: j3 ~三. 模型建立" }+ q. {! Z7 U+ M. W
设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :
, p$ o3 G4 Z. {, N: s & a+ E3 ~6 l$ k, ]7 t
利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离4 m0 x- E% b* O- l% C) e3 U7 c
2 H+ ]" l) b. Q解:先写出带权邻接矩阵:
9 Q. o2 Y3 D; |" u9 Q* _9 g5 f; f
5 f0 I N3 e! g8 j后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .
' N- L* y% N3 R" c4 [) k; P四. 模型求解(含经调试后正确的源程序)
) t# `* N: h/ N- ~! h( O" _# \% S- d2 f(1) Dijkstra算法
& o% M: g" f- x7 Q, T1 Y2 d0 E3 Croad1.m文件源程序:
4 n& F6 A* d* |( Q6 Y: r3 Uw=[0 1200 inf inf inf inf inf inf inf inf;1 t! D+ j, y1 h5 {/ N1 l; h
1200 0 12 202 inf inf inf inf inf inf;
! l$ `' h4 W! x1 m( q# r/ Pinf 12 0 inf 201 inf inf inf inf inf;
8 u, ~; g# \5 S- iinf 202 inf 0 31 20 inf inf inf inf;0 U& r5 F0 U( Y6 u4 G9 x. D
inf inf 201 31 0 10 inf 205 inf inf;- R3 ]3 Z( F" I. x+ r( J0 I
inf inf inf 20 10 0 195 inf inf inf;( H& k' H4 Y$ T& }; I3 _
inf inf inf inf inf 195 0 5 306 inf;
# _1 [6 \3 y" M* xinf inf inf inf 205 inf 5 0 inf 194;( L# N0 e% N8 l1 _! ~, w: m
inf inf inf inf inf inf 306 inf 0 10;5 {2 {! J- L4 e: \( u( T
inf inf inf inf inf inf inf 194 10 0]; ( j9 y- o- A, O6 [" ?( t
n=size(w,1);
' Y& I8 G& E& n# \w1=w(1, ;% h2 s2 V$ r9 a: y0 X$ J
for i=1:n( I) Y% y; p4 \8 n1 E* s d) H
l(i)=w1(i);
+ O/ V* ?9 c9 `. |) {# d; h z(i)=1;* k5 _" m' |# v! D
end
. F7 n/ O Z, M5 u) H# ^s=[];9 D5 `9 ]9 W7 K; `& I* B* x
s(1)=1;% q; Z/ [4 a; v6 T
u=s(1);% R, d O( e/ {( }8 }, c
k=1;
+ m* y) x& g4 g( x2 N- {) Q) Z0 wl;
6 L6 N! h* \! p& c8 x# `/ J ~1 `; s Mz;7 b' X) R1 Y+ l+ r2 F' i
while k<n
6 G6 X: M4 d9 z% M3 q5 e3 O* ~" x% j for i=1:n1 M3 m$ e2 e6 P5 Z& S
for j=1:k2 H1 O3 |) _1 r4 p1 S
if i~=s(j)8 @6 h& T; ]) q9 [3 C; u/ v, S
if l(i)>l(u)+w(u,i);' B7 ^2 N; {3 q% y' J
l(i)=l(u)+w(u,i);: {7 C# M. x% ^2 I, x$ u+ Y
z(i)=u;! V5 ]1 a, L) |; {: U
end3 V' k' D, D" M* D
end+ }, n2 ?2 {( s
end+ D4 G& k" h# T' N/ K+ t
end' @% h; b% ]! n5 q, ~& D3 D, l
l;2 k& S. M0 H& z
z;$ h3 p4 ?8 z8 D+ V* I( W, m' v* \
ll=l;( o" ^4 B: i4 s8 I8 i2 c' n" z2 O
for i=1:n6 r5 C o$ I) L; j O* x y9 y1 `$ |
for j=1:k
( a O- m( b) A3 N$ U if i~=s(j)1 L3 k2 N+ G2 W9 y
ll(i)=ll(i);
, ], F) I2 ?. _( i* R else
1 Z! }; `+ {' g6 ^8 u* [ ll(i)=inf;
' b( q6 U- ]1 h end& S+ b/ b h( m1 @! ?7 u* h6 V
end
: i# v$ y& Y8 l" ~$ V4 cend- l& ^: s' g1 F# R+ @9 M0 G
lv=inf;
% w" w+ O* T" T" M( E: A( i' _for i=1:n" t2 z2 H: p0 R5 K' z6 O
if ll(i)<lv
) f V$ Q# A% I9 Q lv=ll(i);' Z+ }# l8 t5 p7 D
v=i;
1 j/ O+ D& r' w2 }; E7 C end
$ R# P) ?' B/ ?end
- R4 J) p1 w$ blv;
9 N; X- F2 a% r4 Q' s+ c% i5 kv;
/ z9 J& {* ?' u6 d Zs(k+1)=v;
0 \1 M& X2 p8 D L) a& ^ y! ~k=k+1;: Y: j4 G% m. j5 p2 i
u=s(k);
; A( m1 V! `1 e& Tend8 [/ u, R2 q5 T; F5 U' E
l
# n7 b4 ?- Z: O4 f1 \" {/ U7 Jz
; ]$ F. E5 [) w$ e4 x! L6 y" d H/ C1 ?; ~
(2) Floyd算法: j5 z' l+ H9 M5 O
road2.m文件源程序:/ ?) e. M$ o4 G2 R R. ?
a=[0 1200 inf inf inf inf inf inf inf inf;# i5 h: C* y, r- n! O8 S4 f
1200 0 12 202 inf inf inf inf inf inf;
9 X* r% e1 n) w! o1 B& jinf 12 0 inf 201 inf inf inf inf inf;1 z7 s* o8 w$ o8 F
inf 202 inf 0 31 20 inf inf inf inf;
' R* |& I/ L4 j6 s4 H/ d7 minf inf 201 31 0 10 inf 205 inf inf;- `( m' D6 m' }6 {+ a5 Q! @( ?
inf inf inf 20 10 0 195 inf inf inf;2 L" N7 ?: r! r0 }1 P) e$ V
inf inf inf inf inf 195 0 5 306 inf;
+ T( ]9 G9 R/ g& W# {' Qinf inf inf inf 205 inf 5 0 inf 194;
7 Q( D5 q8 p+ J9 u( kinf inf inf inf inf inf 306 inf 0 10;! o! E; h8 ^% x" F% o
inf inf inf inf inf inf inf 194 10 0];
, }: T2 Z+ h0 l$ s/ N[D,R]=floyd(a)% u$ |" V0 H- |1 [
floyd.m文件源程序:6 R% U5 m& S- [- r7 v6 K6 |
function[D,R]=floyd(a) I0 v6 d! w( w# Y. f' x
n=size(a,1);
* t5 l5 O9 {6 A$ M9 S8 e2 UD=a5 @. h) s1 s G! L$ Z
for i=1:n
3 u! X& W0 x' F1 b w for j=1:n
- x j% o# o! G3 @9 r1 W2 ?! V R(i,j)=j;6 K! m: r& f4 ?' h5 B- f: X
end
/ h6 a( o/ o- S8 eend
# E7 f- N6 c/ m, v" O) V: m$ UR
1 E& y+ r, r$ ?for k=1:n" }4 B+ J2 X1 w- ] Q. S
for i=1:n
1 t0 r& J+ g k# y( V) L6 [% b& n for j=1:n% z l* n! K6 x% p5 P" F5 V1 {
if D(i,k)+D(k,j)<D(i,j)! a1 f% l! i: ^& R3 N
D(i,j)=D(i,k)+D(k,j);
8 { G) U( d% z: g/ n( ~ R(i,j)=R(i,k);
* V$ |: s4 n! ^+ y7 a* K* B end% J' q6 u2 g8 J- Z5 z
end$ a/ r7 n/ X: B0 p
end
0 T4 r* p- w/ v$ o/ { k
+ v8 w' ]2 W# e6 S D
7 d2 Y# E) d# ]" J R
( |1 N) E _8 }7 Uend7 M/ e j2 }8 _3 H/ G- H. C5 V
五.结果分析
4 }; \2 ~- p) v& B- `! R/ G6 Z% s* w(1)Dijkstra算法! k( S; y* B1 H: b6 t' f& H' J
运行结果:
7 |: P, x* T( x5 J% P3 Xl = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812
7 i! ^( c$ k% D; e' xz =1 1 2 2 3 4 6 5 10 85 ]+ a, n% L! F+ P8 V5 N( {
- A* z9 @0 c! f2 \
结果分析:
* C' d0 y0 W8 h& G7 P通过运行结果: 到其他顶点的最短路的权 ,可看出," T* _. Y# O: v, @4 n7 K8 \- a5 i
到 (即 到 )的最短距离为1812(km);+ Q W$ l/ ~7 ^( ?" g4 g
到 (即 到 )的最短距离为1618(km);
; g$ V" k+ I( }& {7 G: w3 x; I+ t5 k& e8 {# v
到 的最短路径为:V1→V2→V3→V5→V8→V10;& n- X! R: ~" W# t
到 的最短路径为:V1→V2→V3→V5→V8。
9 V. K. E9 r1 u ~- ?1 i* Y0 |
\6 }7 m4 e$ r(2) Floyd算法
* d7 Y; h0 ^ c, t% q O1 }# s运行结果:
3 {$ X+ s) E; e, nD =
. [+ C' A, `5 M6 l$ v5 [ 0 1200 1212 1402 1413 1422 1617 1618 1822 18124 W6 s$ T6 ^6 | U& W, k) s
1200 0 12 202 213 222 417 418 622 612
+ j& T/ w- d8 B2 ]5 \3 | 1212 12 0 214 201 211 406 406 610 600' E- [7 C! D. I( r4 H
1402 202 214 0 30 20 215 220 424 414
! Q/ I* ?% N( U 1413 213 201 30 0 10 205 205 409 399
B! i- l6 W1 O 1422 222 211 20 10 0 195 200 404 394
; s8 w, \ G3 w" h5 F 1617 417 406 215 205 195 0 5 209 1996 C0 _+ ]9 _) D3 j m6 A& T
1618 418 406 220 205 200 5 0 204 1945 Q: a* a$ D& g0 }. V: p
1822 622 610 424 409 404 209 204 0 10
# I+ C+ ?9 o" C# c/ w 1812 612 600 414 399 394 199 194 10 0
& t9 r: ^# g7 X% ^* Z3 C
1 S: M1 w+ T; b- J5 J6 oR =
* |2 A2 t D. t! P. X9 R/ Z/ o" z 1 2 2 2 2 2 2 2 2 2
# H: ]/ N% F5 g8 Z; Z0 [. M 1 2 3 4 3 4 4 3 3 36 o" I) ?' q- q! h2 `9 B
2 2 3 2 5 5 5 5 5 5
- K B" o. y8 ?. g) K) W 2 2 2 4 6 6 6 6 6 6
+ l! K2 b1 B }) h& \1 e 3 3 3 6 5 6 6 8 8 8
; S! J+ V5 L" x+ F% o0 X. g; } 4 4 5 4 5 6 7 7 7 7
q2 A6 Y* L* H5 f- X 6 6 6 6 6 6 7 8 8 8
3 ?2 q1 T8 ]5 U& P 5 5 5 7 5 7 7 8 10 107 C2 n7 i: q/ M) ^& p
10 10 10 10 10 10 10 10 9 10
* J, s1 f7 S! G8 c9 n 8 8 8 8 8 8 8 8 9 10
5 R9 i) I( X+ J+ j结果分析:
+ t: @! T, D9 r通过运行结果:可看出,+ }3 w: x, |6 g3 ~
到 (即 到 )的最短距离为1812(km);
R. J6 t7 K7 F5 m; o2 N5 l 到 的最短路径为:V1→V2→V3→V5→V8→V10;
* G- V! x- v& s 到 (即 到 )的最短距离为1618(km);
5 p9 \" J" I# n7 _4 H 到 的最短路径为:V1→V2→V3→V5→V8。) A, c% p1 b% T
9 ?' V- o# ]' ~8 }& Q @ A5 F0 S4 q _3 z
|
zan
|