- 在线时间
- 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]初来乍到
 |
最短路问题及其算法
% T" p' Y n& ?- s2 ?# |5 H. r3 O一.实验目的:
; E6 [# n% d/ m$ D3 i& v6 s; F) d1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;" _$ L: G+ L v) U. w
2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.
1 e5 |7 q& Q8 J* U6 Z, F二.实验内容:
- G! G4 }6 W; ?6 F* h2 ?: d要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).4 Z$ X; L& Q' C4 n& A2 b
为方便计,1km主管道钢管称为1单位钢管.
% W& i! g3 O3 B7 z一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:
1 h$ N* s5 H3 o3 i/ J. E. k , G' v* R9 c) v' x8 Z
1 2 3 4 5 6 75 H* t( ?% T) Y
) ?/ m" P9 Z3 b% `. q
800 800 1000 2000 2000 2000 3000
( _ i( u1 ?9 g0 A0 r1 p 0 F) Y C& r* ?: W3 g: a# ?4 O; f6 p
160 155 155 160 155 150 160! H; @7 `3 U1 Z# l/ A8 P! U$ J9 e, B
& [) J% H6 {) s' B7 e- Q
1单位钢管的铁路运价如下表:' y9 i* ^9 A4 E) G( Z
里程(km) 300
2 }3 ^9 L- R. w0 i3 @2 [4 Q301-350 351-400 401-450 451-500
2 `( g# {, @" Z9 _* v运价(万元) 20 23 26 29 329 W( j1 x, j2 [1 @# h7 @/ b& w" V8 x7 c
里程(km) 501-600 601-700 701-800 801-900 901-1000+ R- S) C, N0 C% M5 ]! Q
运价(万元) 37 44 50 55 60
( M7 j+ M. U! u+ c, r1 I1000km以上每增加1至100km运价增加5万元.9 j9 o4 @1 z5 W$ |+ s- z
公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算)., _1 u# a: o }0 h2 r/ u
假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元./ Q4 P# V/ c( B# r( M: _& \
8 g5 Z/ l$ R* M! ?0 L. Z4 h
试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.
- w& x* t1 R4 n# Z# z$ i三. 模型建立
0 k4 }( o% K X& d& g1 J* `设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :
; \$ T% J L; w
: u6 I( n* c0 r6 I利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离
y% W, z; I0 | * J! L: {4 F, R! O* K- o4 H
解:先写出带权邻接矩阵:9 d0 @. U/ p+ _/ a
3 {, A" c9 P+ d, z8 K, k
后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .
9 x6 J" ? Y) o/ r四. 模型求解(含经调试后正确的源程序)
% Y% c# V9 `* u1 o% _9 |3 ?0 G8 h p(1) Dijkstra算法8 t9 o, d9 s4 @" j
road1.m文件源程序:5 j+ [9 h6 S) Y4 `
w=[0 1200 inf inf inf inf inf inf inf inf;
- O s' b0 a: c# a1 f9 z7 S2 q1200 0 12 202 inf inf inf inf inf inf;
; r) M/ J( j0 p3 Z' finf 12 0 inf 201 inf inf inf inf inf;
/ k6 {* ]6 j" P0 r% {1 Iinf 202 inf 0 31 20 inf inf inf inf;
( L, @- e8 Z5 e! }- ?$ [6 sinf inf 201 31 0 10 inf 205 inf inf;
! ]$ [6 G3 @" Hinf inf inf 20 10 0 195 inf inf inf;
8 v' L o& [9 s% p vinf inf inf inf inf 195 0 5 306 inf;% h$ K! }6 Y8 a, Z
inf inf inf inf 205 inf 5 0 inf 194; M0 u$ d3 j, z; Z
inf inf inf inf inf inf 306 inf 0 10;* e E* l( Q7 A; T# s
inf inf inf inf inf inf inf 194 10 0];
, U/ J9 p S1 ~+ \2 F! Q# m: m* f, nn=size(w,1);& e7 L" a# [4 Q' `& F+ k& F& B
w1=w(1, ;2 W9 J( J: H4 V1 X, M& d5 j5 q
for i=1:n
/ q1 B" e# k" s" m6 r l(i)=w1(i);
8 O$ ?7 Y& t+ p6 v+ L' i z(i)=1;
) }* T' F1 ]/ J8 Wend
) l8 `% o* h9 f" b/ i$ ~s=[];- E+ s# x( C0 Y& \$ R
s(1)=1;/ l! g1 O, L( N. \
u=s(1);
$ U9 n$ |7 N" K/ Y( @k=1;. G+ E6 J ^. h3 |9 Q& P
l;+ A( c0 R0 l# l. X
z;; C& M n$ a1 g9 S
while k<n. q! n/ S; s) w& o; o
for i=1:n
+ n Z0 j/ H3 A: Y9 ? for j=1:k
5 p) o5 t# f( y) h, K( |, z if i~=s(j)1 q1 i- a: s, g
if l(i)>l(u)+w(u,i);
, A( i0 V. x7 |/ c l(i)=l(u)+w(u,i);, e- S6 e1 V5 R Q) h
z(i)=u;
5 c' i$ }2 C: t1 X) k end
B: c# i' I9 g- @# t: t2 c$ ^ end
+ B# D3 ]3 q6 Y end
) j. D$ s6 N* y. I" ~end: R s- f6 [9 m: J8 r! J; t
l;
( r" d4 {3 i8 R" P4 h z;, \2 D" P' v% s: Q9 e
ll=l;$ j8 \; n6 @' w5 H* q
for i=1:n4 x* ^; x7 H4 z% l- n6 D
for j=1:k
* E/ `5 v4 L' w5 r4 b) m9 \! d if i~=s(j)" X1 E b* z1 @3 F0 |
ll(i)=ll(i);% V+ I) P1 B" D4 ]
else
: a4 p' R+ }# T! P, a% F ll(i)=inf;
; ?9 L8 @3 \& z6 Y8 l9 e5 b% a end
) Q2 F( y* V7 |end5 e* D/ n/ |$ h' O! ]- i
end- _6 B) |# S. }9 F2 S
lv=inf;
) H2 ]2 I* O8 xfor i=1:n% h/ j! G7 x8 g9 v; ~! ?( V+ _ Y
if ll(i)<lv
7 f; R2 Q* T0 W0 J lv=ll(i);# o y; }, }! [) a5 S
v=i;
) `- r# ~+ |3 @ K4 O& K! J end: n% h% B2 l, g6 u
end
3 ]! n0 o0 V/ W( i& Qlv;
* Q( R/ V3 Z1 |v;
, b, y# X7 |$ Q& s% t& Ts(k+1)=v;
3 p) E" a% g l6 W( a3 p3 h& M Yk=k+1;1 L1 \2 _8 w7 J/ W. Y! L
u=s(k);, J3 O$ D; b3 P1 ~* P
end( W+ U. |, F1 ]1 o: p' A7 V
l
8 z* ~0 ]: ^# V4 n& ^z) @2 M/ C" [; M6 P! F
8 E( }# I5 }( u+ }- T3 Z(2) Floyd算法
' y/ a" J2 u O# t2 iroad2.m文件源程序:# x: `4 g% s. v' S/ w
a=[0 1200 inf inf inf inf inf inf inf inf;
& h4 J- n4 t1 p! M: \5 {* Q1200 0 12 202 inf inf inf inf inf inf;1 p7 {. B. G" W: w3 A: d+ a& g
inf 12 0 inf 201 inf inf inf inf inf;
4 |0 n( D4 C# q+ c% u( Hinf 202 inf 0 31 20 inf inf inf inf;
" ~" G9 c4 V' U! Kinf inf 201 31 0 10 inf 205 inf inf;- `0 W5 k+ {5 A
inf inf inf 20 10 0 195 inf inf inf;
4 b- K# u+ l! j' k) `+ C: sinf inf inf inf inf 195 0 5 306 inf;/ A; [+ S: C _
inf inf inf inf 205 inf 5 0 inf 194;
# f# `% c+ O, a2 I, t) k' P: Dinf inf inf inf inf inf 306 inf 0 10;
! @: ~- k1 I7 l1 dinf inf inf inf inf inf inf 194 10 0];
1 a* `0 M2 N! I; v[D,R]=floyd(a)
" O( C% a% y R7 R, jfloyd.m文件源程序:8 C) e ^3 d; v/ X D4 A% U9 R
function[D,R]=floyd(a)
p- ~( n2 r% A. mn=size(a,1);
, v# q( N I! f, M- f$ }1 m7 OD=a
! C$ Z2 q$ ~" }' `+ u ~; Rfor i=1:n+ V( a1 {, f1 z- ]
for j=1:n
6 e9 K3 Y4 D+ F$ X% c* s R(i,j)=j;
0 X8 n+ s) P' f9 m* n5 ^ end9 \7 K |9 I- |
end
, \' w1 N: C1 ?& s" x# H, s9 QR
9 O. U; i7 D7 L; `/ ufor k=1:n9 T' N' c' m1 ~
for i=1:n
& e6 Z: r8 l) x! j+ \3 I8 f) [, S4 Q for j=1:n- e* d. d# _: G) v/ [
if D(i,k)+D(k,j)<D(i,j)! T* D: l# z5 F: h5 O* d. ^9 y: R3 u
D(i,j)=D(i,k)+D(k,j);: O/ m# t. c6 v/ I$ Y# @% S
R(i,j)=R(i,k);3 p2 ]/ B/ w: B0 Q
end h/ p. ?+ p7 E% a* C
end
7 r6 b( D, h' V! }" K8 } end
- ?/ r% C* _- _, L k
8 S9 y! p) H: O" t4 H) l D) m7 v) |6 B9 U
R# y$ o3 [' o+ d' X. h; p' k
end
. c% _7 j& C' j; ]* h, o五.结果分析& g8 S3 g4 ^" c& v6 n8 K
(1)Dijkstra算法1 D( `7 o7 ^1 s
运行结果:6 t1 s$ `5 n4 x" T
l = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812
+ N, m; Q' q' D; v1 G1 [# sz =1 1 2 2 3 4 6 5 10 8
6 [0 A8 I/ }2 W1 F4 i1 |' d4 G 4 S2 b) S& c/ E7 g- C. f5 n( ?
结果分析:0 u2 t) v: Y- f/ H h
通过运行结果: 到其他顶点的最短路的权 ,可看出,
% I" h: b4 U- O. h 到 (即 到 )的最短距离为1812(km);
9 c9 |$ i- ?- f. i" P 到 (即 到 )的最短距离为1618(km);9 Z+ M$ j6 E1 N# r' F, {& d- q
& j5 v: J! f4 ~4 S5 Q2 f, y* H, i: ] 到 的最短路径为:V1→V2→V3→V5→V8→V10;
# P2 l( R+ D8 [# ` 到 的最短路径为:V1→V2→V3→V5→V8。
$ p8 H. W! O v( S; d5 }) p t! _
(2) Floyd算法2 _0 H* `: N- ~; `
运行结果:
- ^% p' M. q6 a! E8 g& J# {D =
8 b& t( J2 b( `0 {4 J 0 1200 1212 1402 1413 1422 1617 1618 1822 1812
7 S) l# J0 v* `: {! o# d2 X 1200 0 12 202 213 222 417 418 622 612
3 {8 A* Z }: B% ?- T$ N 1212 12 0 214 201 211 406 406 610 600
% B2 T9 t- r4 K, Z 1402 202 214 0 30 20 215 220 424 414
% ^2 H# i1 P4 h$ k3 U 1413 213 201 30 0 10 205 205 409 399
. M# p- Y6 N6 t8 d" l/ A 1422 222 211 20 10 0 195 200 404 394& s& f( u7 V2 }. x5 z
1617 417 406 215 205 195 0 5 209 199
8 H- Y1 b- q* Q2 V# Q8 W$ t 1618 418 406 220 205 200 5 0 204 194
4 Q. z0 O/ X8 B+ a/ o 1822 622 610 424 409 404 209 204 0 10
) \* Y; O' i5 D4 S( d+ I+ ^ 1812 612 600 414 399 394 199 194 10 0
' |5 K) X$ I: {1 J, n2 `+ {: a8 b6 ~/ M% R
R =
* J; k8 E+ h% g) P3 o+ l 1 2 2 2 2 2 2 2 2 2
/ a# Z q! M7 U) W, E 1 2 3 4 3 4 4 3 3 3
2 H! H1 J1 Y; N* a/ `8 \ S( f 2 2 3 2 5 5 5 5 5 5) X. x3 y# c' l% ]
2 2 2 4 6 6 6 6 6 6
9 i' R* ~7 I7 y2 t1 [( [ 3 3 3 6 5 6 6 8 8 8
( F I7 m% c- [! g 4 4 5 4 5 6 7 7 7 7# B+ o6 p7 H3 X' d$ Q4 Z
6 6 6 6 6 6 7 8 8 8
2 Z0 r" h# l2 O7 @& `8 `% r 5 5 5 7 5 7 7 8 10 105 w( Q; J# S$ w( X# m7 O
10 10 10 10 10 10 10 10 9 10
) B8 m. ~4 h1 Y# r7 G- V 8 8 8 8 8 8 8 8 9 105 g4 m }0 w- D3 `
结果分析:. V W ]! H3 G9 h! b2 Q' y
通过运行结果:可看出,- Y$ e7 }; G3 @( l9 R+ M
到 (即 到 )的最短距离为1812(km);
- N1 V- K+ Q m7 u) q 到 的最短路径为:V1→V2→V3→V5→V8→V10;6 L3 J- W8 b* F$ m4 R" ^1 T
到 (即 到 )的最短距离为1618(km);
S* `- h8 j; _" R# j5 j& ` 到 的最短路径为:V1→V2→V3→V5→V8。
; d# z# \) ~( o0 i: R1 _2 j
9 U5 f% w$ k( m. ?8 K3 u! n' O4 j9 ?# e: O- R
|
zan
|