- 在线时间
- 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]初来乍到
 |
最短路问题及其算法+ b0 n( e) t( o2 A+ T1 Y4 [
一.实验目的:. K/ s0 l$ y, s$ [: \% h4 j7 G
1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;; ^% a- y& R. g: ?3 Y6 f5 u+ N: ]% a5 F
2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.- ?- \6 Z6 z% l5 D' ^8 M9 s- t$ b8 u. ^
二.实验内容:
% ]8 e6 P- U/ C2 Y6 s. T+ A要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).% e# c0 q- ~3 Q
为方便计,1km主管道钢管称为1单位钢管.8 g8 C6 @$ D" y) x. z1 J
一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:: m# Z5 R, J$ \6 q7 Q T
* G- [! j4 u1 S
1 2 3 4 5 6 78 f b$ @$ w- m. n
1 C/ r9 Q# h- K2 R2 N% _; p800 800 1000 2000 2000 2000 3000
9 c0 x) ]" n9 T4 ?% S2 N + V) n) Q! \; o2 c8 s+ I
160 155 155 160 155 150 1601 }" R, T- a: V0 U
b; D3 ]0 i( o( \1单位钢管的铁路运价如下表:, Q/ `6 t8 h* y, H
里程(km) 300
9 e3 ?3 Z4 \6 u# K1 e( S+ F) t301-350 351-400 401-450 451-500
, d/ ~' Y" @6 Y' s/ M运价(万元) 20 23 26 29 32
2 `, D# F* y9 n' D3 r: K# h里程(km) 501-600 601-700 701-800 801-900 901-1000
4 ?! Z6 t. ^8 J& G' Z运价(万元) 37 44 50 55 60
! i" t+ S3 I; p, k1000km以上每增加1至100km运价增加5万元.
; y, o1 m8 f) I' l; n, S/ Z8 e公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).( U7 ?- V7 l) a( g2 {; N
假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.6 h# e$ {& f7 @
' S3 [ X8 p! C7 O试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.
" ~) `! R) X2 w& D% x9 u( M1 `4 \三. 模型建立& q( c) X$ W3 F7 {, k+ L4 K7 Y
设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :( P4 h, _, S6 {0 P
) ?# R1 c- @2 a) _) _2 D
利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离
- r. S% U3 D9 P$ M& I
6 m# I P w# p9 k' z解:先写出带权邻接矩阵:
6 b- Q6 c% n6 \. q7 T% o6 X f
2 e4 m2 L+ Z' l# \" r9 w* p* U后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 . Z, b4 f- M$ w# `4 I
四. 模型求解(含经调试后正确的源程序)
1 F5 u5 s8 i, {0 J(1) Dijkstra算法: P9 B0 W; i; h1 c6 E0 q1 _
road1.m文件源程序:5 d" n( L' b. I3 a9 n
w=[0 1200 inf inf inf inf inf inf inf inf;
: w" Y( v1 y( B9 v- p- ^1200 0 12 202 inf inf inf inf inf inf;( V+ H' z' m) \! I% ]3 ^6 }0 L; ]
inf 12 0 inf 201 inf inf inf inf inf;
" N4 ?4 l5 t, K' h! | R; l% l6 @inf 202 inf 0 31 20 inf inf inf inf;
3 E3 ^: z$ ]! }( }+ |- Yinf inf 201 31 0 10 inf 205 inf inf;
/ A p, E6 s6 L/ V+ jinf inf inf 20 10 0 195 inf inf inf;
6 _% ]( W- v2 |8 f1 V) D( p+ Dinf inf inf inf inf 195 0 5 306 inf;
3 J. ?8 D) Y- Ninf inf inf inf 205 inf 5 0 inf 194;& Y7 ?# m1 b5 Z' `1 ^
inf inf inf inf inf inf 306 inf 0 10;+ ~ d e$ d: ~$ S! M: ~# _0 q
inf inf inf inf inf inf inf 194 10 0]; " [4 D* `$ Z: G3 z+ Y
n=size(w,1);
3 v3 o. t: ]) e+ v pw1=w(1, ; k, k) [; o2 ~1 b9 v* ]! }
for i=1:n
' K* H2 [& o' c1 M6 K0 U* [5 u l(i)=w1(i);6 `, D9 G/ M* t" t0 Q
z(i)=1;5 }( R- k( ?5 T8 W
end
. W' F* I% P) N$ a. qs=[];0 f0 ]: } P- E& q
s(1)=1;
" F6 h/ m7 l9 v' j+ |0 ^u=s(1);7 P6 ^: G) U0 v& q- k' I# q
k=1;
+ [6 M( a* @- y, W* A) ol;
1 a% w* ~9 A; D1 Oz;
# v) ~6 L, t' A' Awhile k<n
( M0 s" C" U+ e( h9 S9 V for i=1:n" [# V! S( ^) ?2 }
for j=1:k
1 `6 ^5 q! o, U% A6 f& Q$ F if i~=s(j)8 f# E3 b# U$ H0 {
if l(i)>l(u)+w(u,i);- d! t( ] o9 H/ ^
l(i)=l(u)+w(u,i);
9 K* m. ^. t+ j/ m z(i)=u;5 I2 p u5 ]4 k( b( t1 G
end
3 g4 L( a) `9 l end
! @6 ]7 b" v" M. ]2 V. ?7 e end
$ X9 E, z4 Z- j# H8 hend9 g' q/ ?# O O$ u
l;% i F& j. }/ I/ o" v& K& @
z;
* x- C7 I# y( a1 f* ~ll=l;
! Z1 H3 A/ k5 d2 r4 r for i=1:n
+ ~8 [' b5 K+ M8 z for j=1:k! C+ g3 { c2 E7 |9 h8 ^0 b
if i~=s(j)$ b1 ~1 H1 f+ A
ll(i)=ll(i);
4 a( `3 ~- \- ^6 k& \4 j& g0 r7 e else" d- p" f* b7 {1 n' Y5 v# d
ll(i)=inf;
[. r: r' @9 e% r( e% f" V2 A6 V end
4 ~, W1 E/ ?; l8 j; g5 [- e1 n) p3 ?end
2 O% {; J" B9 n: ~$ eend7 Q* S! E/ p3 C5 i& i# C. u
lv=inf;
% a! E, z* Q* A$ B5 Y4 D, f) afor i=1:n
8 R9 V/ }; ?; Z; I) ^ if ll(i)<lv
0 }5 E! z8 U4 z! P! a lv=ll(i);9 [2 U! }, Y8 I) }' l
v=i;
0 m0 Z0 n5 `1 N2 ^8 K: O! E end& Y% v! P% r' Y# T& Y
end
0 u/ ^% h' p& elv;& w9 w& j' p, s5 A4 o
v;7 M- }! T1 O. b' A, x7 X9 e" F
s(k+1)=v;9 p' C) L j4 a% H. C" \
k=k+1;
( A! G2 h' z c$ G, m+ Pu=s(k);3 F; q3 a$ t4 V8 F( r
end4 @7 |3 v) ?5 m+ M) i& q, W, D
l
' J1 ~; l0 @- P+ Ez
" y" B6 H/ \ \) B- e1 p- t3 {, A" T5 Y: @1 ]
(2) Floyd算法' c6 j# i4 R/ v+ ^
road2.m文件源程序:
6 C) g& P2 h4 J3 r# da=[0 1200 inf inf inf inf inf inf inf inf;8 s6 R$ Q" n1 [# ]# ^
1200 0 12 202 inf inf inf inf inf inf;1 y4 r5 t, H& p& q( v5 {
inf 12 0 inf 201 inf inf inf inf inf;% z9 R: t. E- H7 k9 ~1 W9 s! S, O
inf 202 inf 0 31 20 inf inf inf inf;. @- F5 k B$ U i6 `1 h
inf inf 201 31 0 10 inf 205 inf inf;$ u, S4 X, ], Q1 U0 o
inf inf inf 20 10 0 195 inf inf inf;
: O) W/ j9 r }6 a, ?5 G! ~" tinf inf inf inf inf 195 0 5 306 inf;9 J0 f# _ u3 }1 P+ F Z8 l
inf inf inf inf 205 inf 5 0 inf 194;9 I7 U, {7 o. I% z' s
inf inf inf inf inf inf 306 inf 0 10;) W U! G" `$ H
inf inf inf inf inf inf inf 194 10 0];
S* p7 L" C: d# [3 }, x[D,R]=floyd(a)) ` J& Q$ c3 {8 g
floyd.m文件源程序:
8 f- Y/ s5 ^) J( u" s. A, r+ U& Z, qfunction[D,R]=floyd(a)
+ r8 Z" y+ Y- K: |" j9 X F, _n=size(a,1);
' j' v) K" \4 l' RD=a+ M' l) K5 m6 P
for i=1:n. r( P( U, W( k' a5 r; k
for j=1:n7 L0 c' A! g' ?) G3 J
R(i,j)=j;
( q" C9 H J1 d: v# v; u end
+ | m& Y- E% o# {& \5 H: Xend9 Q+ |0 T( Z2 L+ P- ?- R
R8 h: p6 d6 |7 l3 \
for k=1:n- A' v2 q4 R7 r% {
for i=1:n Q- Q1 ~9 B5 k! s2 y4 s
for j=1:n
; i" [1 O) ?% J if D(i,k)+D(k,j)<D(i,j)
1 p2 ^/ e/ T0 p D(i,j)=D(i,k)+D(k,j);
1 |- f- m7 s8 J# ` R(i,j)=R(i,k);
$ A6 [0 _ D G8 K6 G5 S end, ]0 u! J$ p X9 Y" n
end
- x( w! c) z0 n end+ O1 q2 A% ?/ ^7 \" F0 D/ x O
k& ~7 e# s( L# T% N6 l
D
, X8 i2 t. E+ i, W# [ R& O1 e4 Z. N v% t' _" z4 V
end
7 d1 W; G( L* I, W7 C, F( }五.结果分析9 T$ e: |9 i9 s# b' T
(1)Dijkstra算法
9 I0 _* }# a& \4 E运行结果:7 B1 g5 `6 p1 A1 L, f
l = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812# {& G0 @: \' r: T5 {: z
z =1 1 2 2 3 4 6 5 10 8
/ V; t6 m% g& ~5 p$ l
% K; N7 o: m% B3 t) r结果分析:
1 y- z& _% s: s' {通过运行结果: 到其他顶点的最短路的权 ,可看出,
; Z7 s) U: e! R% P4 t k 到 (即 到 )的最短距离为1812(km);
5 d1 ]8 s( B' q5 c- F; o* W9 |, ?" i 到 (即 到 )的最短距离为1618(km);- h5 l5 q7 [+ \4 C6 J+ c% u
. s7 {# Y# T$ h& ^; f' o
到 的最短路径为:V1→V2→V3→V5→V8→V10;4 T1 C& u7 [8 f9 C- C; X
到 的最短路径为:V1→V2→V3→V5→V8。! U; R! V5 Y1 }% S3 A
* Y5 ~0 ^) `; P(2) Floyd算法" k3 G0 s# K) c
运行结果:
! e, e4 u1 M5 p) Y, {D =
& l, F1 v4 L7 @+ o2 a2 m 0 1200 1212 1402 1413 1422 1617 1618 1822 1812
b! C f/ r- @# } q 1200 0 12 202 213 222 417 418 622 612
2 Q' D( B& w/ r6 a" t# c 1212 12 0 214 201 211 406 406 610 600
( v6 d1 n. u8 x0 I 1402 202 214 0 30 20 215 220 424 414
4 k E8 r+ C c$ @ 1413 213 201 30 0 10 205 205 409 399
9 H/ s8 n, ?) M. Q 1422 222 211 20 10 0 195 200 404 394( H" _; L7 L8 A9 C X7 Q/ d0 T' j1 _
1617 417 406 215 205 195 0 5 209 199
: R- V+ x# P8 @1 ` 1618 418 406 220 205 200 5 0 204 194
8 e4 S/ N, ^' r3 {3 a5 i" b 1822 622 610 424 409 404 209 204 0 10! m3 I0 e: v: ?+ N/ [1 H. b; ^
1812 612 600 414 399 394 199 194 10 0
* o( f+ c6 B t
; l& y2 u3 A0 S1 \# X6 H- @* N2 ]R =
: i$ W; U3 x/ j* C0 ]3 r/ R7 t4 q- w 1 2 2 2 2 2 2 2 2 2: P" L; o; _! u4 p& Y8 O K3 T6 O
1 2 3 4 3 4 4 3 3 3, u' U1 `1 _- Z
2 2 3 2 5 5 5 5 5 5
6 \& N% j( h @ o/ E; ` 2 2 2 4 6 6 6 6 6 6
2 t# g" C7 H9 D2 q: Y- l- y" E! k 3 3 3 6 5 6 6 8 8 8
& |# G, K7 o7 `# F* g 4 4 5 4 5 6 7 7 7 70 l6 ]3 y) ^& j* k1 j. T$ w1 M+ x
6 6 6 6 6 6 7 8 8 87 L# \5 ^& }- R. J3 p
5 5 5 7 5 7 7 8 10 102 |2 s& }, s( w$ d; h# s% q8 J3 L
10 10 10 10 10 10 10 10 9 10
3 @( ]8 z Y3 h* U1 d# d; | 8 8 8 8 8 8 8 8 9 100 [7 | \4 W8 Y4 B. |( m
结果分析:
4 `2 m$ E9 D) }+ ^+ ?/ ]通过运行结果:可看出,
+ b% N+ q8 T. ` 到 (即 到 )的最短距离为1812(km);' P# Q: G9 m, @+ H' ^" L8 K
到 的最短路径为:V1→V2→V3→V5→V8→V10;
' z) ^4 y. e1 t; a 到 (即 到 )的最短距离为1618(km);% F- u6 i' u/ D; U4 @
到 的最短路径为:V1→V2→V3→V5→V8。' r* w2 i5 H, {# i
8 v, C7 j: Z# u- L. x- `5 q
9 z$ b9 ^8 y2 Z! ]" B' Q" u! T
|
zan
|