- 在线时间
- 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]初来乍到
 |
最短路问题及其算法
, Z* U1 V& [, _& g, k( w. U& b! f' `一.实验目的:
+ b9 m8 f; \" B% R( N9 H1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;
1 a1 O# g/ \2 T: s! H2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径. @$ n* ~, |! A6 N( l+ j! P
二.实验内容:3 i1 |' [+ a% ~; ?! o; f4 u
要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).
! A1 _6 ]1 X7 f! e. P1 d为方便计,1km主管道钢管称为1单位钢管. [( `! f% T7 e
一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:3 m7 C, n' V4 Q3 @3 |
- V1 {: G6 f/ ?8 ?2 H# ]1 2 3 4 5 6 7
% j' W" C* N: D7 ^ K) ?7 o * @& y1 D F3 H( H- z# r2 O
800 800 1000 2000 2000 2000 3000
0 q4 r6 l2 g" o- E* q3 a. ]' o2 M/ \' T
* N- I' C3 B- M& k* t160 155 155 160 155 150 160
7 }$ `6 G, r: e! W- E) R6 r2 I, [( W0 f: Q# {
1单位钢管的铁路运价如下表:
+ ~/ {! o0 Y; D4 E7 s里程(km) 300- `; M8 D0 X2 U* e- L
301-350 351-400 401-450 451-500
. l' l/ U P4 ^9 |: n) U( R; B/ F运价(万元) 20 23 26 29 32
4 s- R0 p- h- T里程(km) 501-600 601-700 701-800 801-900 901-1000
) V+ v7 |' t% {& |, p+ b运价(万元) 37 44 50 55 60
' Z" N; l/ r3 G6 _1000km以上每增加1至100km运价增加5万元.# G i+ `8 g- V8 l' P6 K! V
公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).; z, m. m. e- j% f9 ]# o( N
假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.
* u5 i% U# f) C6 i, F0 `" Z; B " u6 E* E# Y+ A+ B. e
试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.8 |! w' w/ J0 J" l) O
三. 模型建立
5 s' h- V4 b- G( ], R设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :) Y9 J# N) I `- ^7 C
" q4 c4 A2 X) r0 J- [+ w$ V
利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离
3 N- r; P8 g. l
! u% ?! m5 ?( s. j" X+ q; N解:先写出带权邻接矩阵:
# S% @# D0 j( G2 G: c+ g! n# D) r
* L# n9 j' e0 v" H2 [3 D后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .- A e# x+ @0 d
四. 模型求解(含经调试后正确的源程序)
4 \" z2 Z/ W* u' ^(1) Dijkstra算法
; F9 c: h1 U2 k- ^! Y% A3 oroad1.m文件源程序:
# K, S9 g! ]& _2 |6 ?$ Aw=[0 1200 inf inf inf inf inf inf inf inf;
+ S( e$ h( o. }; z1200 0 12 202 inf inf inf inf inf inf;
, x' [* F1 e8 W8 g6 Einf 12 0 inf 201 inf inf inf inf inf;/ U( Q& f+ Q$ h- K/ ?# W
inf 202 inf 0 31 20 inf inf inf inf;, X9 f& r% ?7 B! J5 t' S
inf inf 201 31 0 10 inf 205 inf inf;
% U: c. G+ \8 hinf inf inf 20 10 0 195 inf inf inf;! K" C' X0 n" S
inf inf inf inf inf 195 0 5 306 inf;/ n- E' E7 Q1 C0 H
inf inf inf inf 205 inf 5 0 inf 194;
7 T: D4 `4 K3 s; g1 finf inf inf inf inf inf 306 inf 0 10;
4 a( F$ R4 i3 ^0 @0 \4 n: G1 d9 ainf inf inf inf inf inf inf 194 10 0]; : r. A( k7 M: G0 f
n=size(w,1);
/ U I# q N% v! _0 q# Bw1=w(1, ;
& ~: e: w8 t3 i3 Qfor i=1:n
$ F- i0 q' r+ t l(i)=w1(i);8 {- R( W P; O8 j$ I
z(i)=1;
: i2 V) _+ `6 S( U' w$ @end
0 \4 u% {" C7 a6 @ J* ds=[];7 Y* l* i; B* V8 g( k3 S( g
s(1)=1;
, p* @; B* }8 A, ^$ wu=s(1);
. U+ F: W p% V# V' |k=1;; e- L8 u& g5 q% W3 i! o! ]
l;+ @) r2 f8 L% O5 V
z;6 H& g( T* c! Y, m$ l
while k<n1 E5 o! ~) ~9 g6 P
for i=1:n
" w$ Y5 R& l; e1 R/ e; }5 B for j=1:k( F2 F5 V4 @/ P; _5 @3 a
if i~=s(j) ]( b% V2 U3 s/ n/ J( {
if l(i)>l(u)+w(u,i);* {. F9 Z0 H1 V- S; u2 M r' `
l(i)=l(u)+w(u,i);
' K6 K; Q3 p& O z(i)=u;
- R# `; N5 X# z' O' N/ u end( g$ b* m) O( j/ v8 r) n, O
end
7 |. V* b' E, V end$ f4 I- r1 R- O
end8 Q! r) z; @8 N# } W
l;7 @% t8 u" {: c# g* ?0 b& C
z;! _! K: A- t% G* q( s
ll=l;4 c2 L6 \! D l6 p
for i=1:n9 I( q# {; G$ S0 O8 B6 R
for j=1:k) {' o7 d/ u; A$ f
if i~=s(j); }3 q3 s9 h) c" w; j% q
ll(i)=ll(i);7 S+ i+ ]8 ^# `/ ?" `
else
" _6 R& h. G# V& W" ? ll(i)=inf;
4 V: `) u" Y+ |4 f! M; G end: J, q/ r; Y- E+ ^
end. i2 \* g: r% R
end
3 g" C/ b) {: ]6 q; A d# G; vlv=inf;
4 q; S/ E+ A$ f5 kfor i=1:n4 ^: z7 f t q" e- F
if ll(i)<lv/ j2 ^$ x" K( p: A& c/ N
lv=ll(i);" q: v7 Y$ x0 r* p: O1 @
v=i;2 u- r" H3 ~2 _# P4 W; \- L
end* f; }8 x; ]* r
end
% _$ C7 {' ^: flv;
1 X) v7 {' J. g" ov;
) E: S5 c5 d8 h+ \. _/ ~s(k+1)=v;, r' O! F; l& a3 q- b& F$ U: R1 Q
k=k+1;5 n* y) m( s8 i: x: \5 ]5 {9 `7 g J
u=s(k);9 U! w+ }$ I; P! d6 L
end
4 _& s6 Q' s7 d$ d8 Gl
2 [. I; J! k) c$ w, Z! A0 q8 }; wz: t* Q5 b. l4 e8 x6 E2 G7 h0 L3 s+ m
) K$ j3 c# ?: u7 j: C% b
(2) Floyd算法
7 W0 q! [9 _; Z+ |road2.m文件源程序:
! L, W l5 W/ @, B; V( O6 Ca=[0 1200 inf inf inf inf inf inf inf inf;
- T8 y4 \1 G$ |8 g3 }1200 0 12 202 inf inf inf inf inf inf;
% {- x3 h9 I" E3 i: c2 L7 f, Pinf 12 0 inf 201 inf inf inf inf inf;
$ ^) U* F/ y9 ^$ R) Tinf 202 inf 0 31 20 inf inf inf inf;
9 L0 x3 q. G& e0 Binf inf 201 31 0 10 inf 205 inf inf;, a. K1 v- [; {! g
inf inf inf 20 10 0 195 inf inf inf;
& d Q( a% F$ c qinf inf inf inf inf 195 0 5 306 inf;
# m8 Y) X7 B! d1 I' s$ _inf inf inf inf 205 inf 5 0 inf 194;, Z! `- S2 J7 U, D3 z' C+ u
inf inf inf inf inf inf 306 inf 0 10;
+ i+ T, I' |3 d( q1 Q# Jinf inf inf inf inf inf inf 194 10 0];
8 ~+ W7 y! y- s0 i8 X; X* Y[D,R]=floyd(a)) s/ k0 q" D& c7 F2 P$ K
floyd.m文件源程序:
( [& D' G7 a9 ?# {$ efunction[D,R]=floyd(a)
6 P) K" V7 W. `" `, {0 rn=size(a,1);
# |: H" r* D: e) T, U6 AD=a3 i* b. @; q9 m. ^
for i=1:n) u0 k3 _. D" P: C
for j=1:n
, {6 g( _8 N# }8 P- b/ j R(i,j)=j;
0 f, T2 Z& E# T' }# x) q* ] end
" `' D; k6 V l) W! q+ r9 Cend
0 X( j# k$ x5 B1 H9 D3 MR
- }. [5 r5 v6 {4 K' w. V( Gfor k=1:n( @- @6 p w) z$ p
for i=1:n
* e" B! B+ l$ h for j=1:n
0 O0 ?9 N4 o0 j. } if D(i,k)+D(k,j)<D(i,j)
; J+ V" K- E, a% n% @- M) T5 ^) l D(i,j)=D(i,k)+D(k,j);( _7 n1 B* w2 k2 R1 c( o ?) j) c
R(i,j)=R(i,k);
. T, `! m0 _0 ? end1 e* [; O$ | E& P5 a
end
& a) ^8 l- m( K% h9 |& a5 @1 ~ end9 d3 Q& M" r; J+ f8 O0 _+ b
k
/ X4 T$ L$ U. d | D6 |7 y% r1 F- O" C( }
R3 X) a6 c7 w. e/ R1 K. ]
end* ?* I7 {( q9 s$ g+ @$ B" o2 j
五.结果分析
/ }5 c- x; N# s( W B1 ~: v. A( g8 V' w(1)Dijkstra算法
6 y, `/ a$ _ \, @: V运行结果:7 h5 |0 j1 k/ S# l
l = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812
z o, E. T8 ?" yz =1 1 2 2 3 4 6 5 10 8! Z' C. i3 r' ~
5 f$ d, m1 r* v' T6 M9 u Q
结果分析:. V/ y/ @# a$ k- n5 f( E( {
通过运行结果: 到其他顶点的最短路的权 ,可看出,7 I) }& N7 U7 e( A6 [
到 (即 到 )的最短距离为1812(km);$ }8 u6 z; P( R
到 (即 到 )的最短距离为1618(km);
0 V) e, D6 B; S- t/ f, V- }
0 L" U8 _, y4 W" j4 Z( h 到 的最短路径为:V1→V2→V3→V5→V8→V10;
4 g6 m/ L; |$ I* I7 m) ~ 到 的最短路径为:V1→V2→V3→V5→V8。
/ m# {- p; R# y% ^% S: w* Z! P j& d+ x ~' ^( {, J
(2) Floyd算法% b% t( m Z L+ O
运行结果:- ~2 R/ I4 C1 @% _- y
D =
6 m( j- S" u i8 N. u5 g1 S 0 1200 1212 1402 1413 1422 1617 1618 1822 1812
" {" R3 u1 w, ~$ W# [; c 1200 0 12 202 213 222 417 418 622 612. D2 }! T' N- l# L0 l1 K
1212 12 0 214 201 211 406 406 610 600
" m! x% c, Z+ ]( Q( D5 u 1402 202 214 0 30 20 215 220 424 414; V* z3 I9 y: d4 y2 i2 N
1413 213 201 30 0 10 205 205 409 399
+ X) j# j/ r2 {. C: k 1422 222 211 20 10 0 195 200 404 394) p i0 K9 h% p. ?1 k6 K
1617 417 406 215 205 195 0 5 209 199& t2 {- a8 i9 u
1618 418 406 220 205 200 5 0 204 194
2 R1 c9 i- ~& o 1822 622 610 424 409 404 209 204 0 10
" U: _; q2 _8 z$ m0 r }0 X 1812 612 600 414 399 394 199 194 10 0: y# T0 b6 u$ u( ]& I
. E$ q/ O" i' L" C8 f% E$ r3 `3 f
R =6 Z6 h+ P2 I4 E a9 D
1 2 2 2 2 2 2 2 2 2+ G9 C7 X& r @6 |' @
1 2 3 4 3 4 4 3 3 3; i, o4 y4 {' z# T& l
2 2 3 2 5 5 5 5 5 58 }6 ]/ s$ e# x! c: U$ m; n
2 2 2 4 6 6 6 6 6 62 L9 p' t4 }% G J4 Q N
3 3 3 6 5 6 6 8 8 89 C# W# j, w3 ?+ Y4 W
4 4 5 4 5 6 7 7 7 7
* C2 v1 A& M+ T- o x8 T 6 6 6 6 6 6 7 8 8 8
s+ v9 z# V6 j( H5 l; E- L2 j 5 5 5 7 5 7 7 8 10 108 I' t" e% a0 H& ~
10 10 10 10 10 10 10 10 9 10* S' y4 l2 G6 B
8 8 8 8 8 8 8 8 9 10
" P/ r# _- L7 T1 v结果分析:
3 p8 z. o4 w1 G: ~6 ^3 B" y通过运行结果:可看出,& K" a( r# o: `: T
到 (即 到 )的最短距离为1812(km);4 I* X- e* s, V( F* C: f4 F5 b
到 的最短路径为:V1→V2→V3→V5→V8→V10;9 U; o3 q0 \7 Z" g+ _
到 (即 到 )的最短距离为1618(km);: t, b. R% A2 Y/ E+ N
到 的最短路径为:V1→V2→V3→V5→V8。
2 V( \1 `! a ? E& ~ K' C' n3 X# b4 F d0 h5 B
- |# H. ?8 M9 ] |
zan
|