§19利用Matlab编程计算最短路径及中位点选址

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

139

§19. 利用Matlab 编程计算最短路径及中

位点选址

1、最短路问题

两个指定顶点之间的最短路径。

例如,给出了一个连接若干个城镇的铁路网络,在这个网络的两个指定城镇间,找一条最短铁路线。

以各城镇为图G 的顶点,两城镇间的直通铁路为图G 相应两顶点间的边,得图G 。对G 的每一边e ,赋以一个实数)(e w —直通铁路的长度,称为e 的权,得到赋权图G 。G 的子图的权是指子图的各边的权和。问题就是求赋权图G 中指定的两个顶点00,v u 间的具最小权的轨。这条轨叫做00,v u 间的最短路,它的权叫做00,v u 间的距离,亦记作),(00v u d 。

求最短路已有成熟的算法:迪克斯特拉(Dijkstra )算法,其基本思想是按距0u 从近到远为顺序,依次求得0u 到G 的各顶点的最短路和距离,直至0v (或直至G 的所有顶点),算法结束。为避免重复并保留每一步的计算信息,采用了标号算法。下面是该算法。

(i) 令0)(0=u l ,对0u v ≠,令∞=)(v l ,}{00u S =,0=i 。

(ii) 对每个i S v ∈(i i S V S \=),用

)}

()(),({min uv w u l v l i

S u +∈

代替)(v l 。计算)}({min v l i

S v ∈,把达到这个最小值的一个顶点记为1+i u ,令

140

}

{11++=i i i u S S 。

(iii). 若1||-=V i ,停止;若1||-

算法结束时,从0u 到各顶点v 的距离由v 的最后一次的标号)(v l 给出。在v 进入i S 之前的标号)(v l 叫T 标号,v 进入i S 时的标号)(v l 叫P 标号。算法就是不断修改各项点的T 标号,直至获得P 标号。若在算法运行过程中,将每一顶点获得P 标号所由来的边在图上标明,则算法结束时,0u 至各项点的最短路也在图上标示出来了。

例1: 某公司在六个城市621,,,c c c 中有分公司,从i c 到j

c 的直接航程票

价记在下述矩阵的),(j i 位置上。(∞表示无直接航路),请帮助该公司设计一张城市1c 到其它城市间的票价最便宜的路线图。

⎥⎥⎥⎥⎥⎥⎥⎦

⎤⎢⎢⎢⎢⎢⎢⎢⎣⎡∞

∞∞∞∞∞055

25

25

10

550102025251001020402010015252015050102540500

用矩阵n n a ⨯(n 为顶点个数)存放各边权的邻接矩阵,行向量pb 、1index 、

2

index

、d 分别用来存放P 标号信息、标号顶点顺序、标号顶点索引、最短通路

的值。其中分量

⎩⎨

⎧=顶点未标号

当第顶点已标号当第i i i pb 0

1

)(;

)(2i index 存放始点到第i 点最短通路中第i 顶点前一顶点的序号;

d存放由始点到第i点最短通路的值。

(i

)

求第一个城市到其它城市的最短路径的Matlab程序如下:

clear;

clc;

M=10000;

a(1,:)=[0,50,M,40,25,10];

a(2,:)=[zeros(1,2),15,20,M,25];

a(3,:)=[zeros(1,3),10,20,M];

a(4,:)=[zeros(1,4),10,25];

a(5,:)=[zeros(1,5),55];

a(6,:)=zeros(1,6);

a=a+a';

pb(1:length(a))=0;pb(1)=1;d(1:length(a))=M;d(1)=0;temp=1;

while sum(pb)

tb=find(pb==0);

d(tb)=min(d(tb),d(temp)+a(temp,tb));

tmpb=find(d(tb)==min(d(tb)));

temp=tb(tmpb(1));

pb(temp)=1;

end

d

运行输出,第一个城市到其它城市的最短路径长度,即:

d =

0 35 45 35 25 10

2、选址问题-以中位点选址为例

中位点选址问题的质量判据为:使最佳选址为止所在的定点到网络图中其他顶点的最短路径距离的总和(或者以各个顶点的载荷加权求和)达到最小。

例2:某县下属七个乡镇,各乡镇所拥有的人口数a(v i)(i=1,2,…,7),以及各乡镇之间的距离w ij(i,j=1,2,…,7)如图所示。现在需要设立一个中心邮局,为全县所辖的七个乡镇共同服务。试问该中心邮局应该设在哪一个乡镇

141

142

(图中的哪一个顶点)?

图9.2.3

第一步,用标号法求出每一个顶点vi 至其它各个顶点vj 的最短路径长度d ij (i ,j = 1,2,…,7),并将其写成如下距离矩阵:

⎪⎪

⎪⎪⎪⎪⎪

⎪⎪⎭

⎝⎛=7776

75

74

73

72

71

6766656463626157

56555453525147464544434241

37363534333231

2726252423222117161514131211

d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d D

第二步,以各顶点的载荷(人口数)加权,求每一个顶点至其它各个顶点的最短路径长度的加权和,可在Matlab 环境下用矩阵运算求得:

定义各顶点的载荷矩阵:

]

4.1.

5.1.7.2,3[)](),(),(),(),(),(),([7654321==v a v a v a v a v a v a v a A

A

D v S v S v S v S v S v S v S S *)](),(),(),(),(),(),([7654321==

相关文档
最新文档