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

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

§19. 利用Matlab 编程计算最短途径及中
位点选址
一、最短路问题
两个指定极点之间的最短途径。

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

以各城镇为图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 ,令
}{11++=i i i u S S 。

(iii). 若1||-=V i ,停止;假设1||-<V i ,用1+i 代替i ,转(ii)。

算法终止时,从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 到其它城市间的票价最廉价的线路图。



⎥⎥⎥


⎦⎤
⎢⎢⎢⎢⎢⎢⎢⎣⎡∞∞∞∞∞∞
055252510
55010202525100102040201001525201505010254050
用矩阵n n a ⨯(n 为极点个数)寄存各边权的邻接矩阵,行向量pb 、1index 、
2index 、d 别离用来寄存P 标号信息、标号极点顺序、标号极点索引、最短通路的值。

其中分量


⎧=顶点未标号当第顶点已标号
当第i i i pb 01)(; )(2i index 寄存始点到第i 点最短通路中第i 极点前一极点的序号;
)(i
d寄存由始点到第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)<length(a)
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:某县下属七个乡镇,各乡镇所拥有的人口数a(v i)(i=1,2,…,7),和各乡镇之间的距离w ij(i,j=1,2,…,7)如图所示。

此刻需要设立一个中心邮局,为全县所辖的七个乡镇一起效劳。

试问该中心邮局应该设在哪个乡镇(图
中的哪个极点)?
图第一步,用标号法求出每一个极点vi 至其它各个极点vj 的最短途径长度d ij
(i ,j = 1,2,…,7),并将其写成如下距离矩阵:
⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭
⎫ ⎝⎛=7776
75
74
73
72
71
676665646362615756555453525147464544434241
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==
输出结果:S
第三步,判定
)}
(
{
min
i
i
v
S
计算如下:
第一步:
clear;
clc;
M=10000;
for i=1:length(a)
pb(1:length(a))=0;pb(i)=1; d(1:length(a))=M;d(i)=0;temp=i; while sum(pb)<length(a)
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;
ShortPath(i,:)=d;
end;
ShortPath;
运行后输出最短距离矩阵,即ShortPath
ShortPath =
第二步:
A=[3 2 7 1 5 1 4];
S= ShortPath * A';
运行后输出S ,即每一个极点至其它各个极点的最短途径长度的加权和:
S =
第三步:
min(S)
运行后输出S 的最小值:
ans =
判定:因为5.69)}({min )()(43===i i
v S v S v S 。

因此,v 3和v 4都是图的中位点。

也确实是说,中心邮局设在v 3或v 4都是可行的。

相关文档
最新文档