医院选址问题——最短路的实际应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
医院选址问题——最短路的实际应用
摘要:在求医院选址的问题中,将居民点与其之间的距离抽象成图论中的加权简单图。
而所求的“可使距离医院最远的小区居民就诊时所走的路程最
近的小区”,则可已简化为图论中的最短路的模型。
在求解模型时,利
用Floyd算法,通过MATLAB计算。
关键词:最短路;Floyd算法;MA TLAB
问题的提出
已知A 地区的交通网络如图1所示,其中点代表居民区,边表示公路,ij I 为小区间公路距离,问区中心医院建在哪个小区,可使距离医院最远的小区居民就诊时所走的路程最近?
模型的建立
问题的分析
医院选址问题其实是一个求每一个节点到其他节点的最短路的问题。
而所选址则为到其他6个节点最短路中的最小值最小的节点,医院就应该建该节点所对应的居民小区。
简化的模型:
可以将“A 地区交通网络图”看作一个简单图,其中包含有7个节点、9条边。
则可以写出其权矩阵D
⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭
⎫ ⎝⎛∞∞
∞
∞
∞
∞
∞∞∞∞∞∞∞∞∞∞∞∞
∞∞∞∞∞∞∞∞∞∞∞∞∞=15
1518251530601830202560202015203030D 利用Floyd 算法,可以得到每一个节点到其他节点的最短距离。
最短路算法(Floyd 算法)
通过7阶加权简单图的权矩阵D ,然后分别算出矩阵S D D D ,,...,,7]3[]2[,其中
v 1
v 2
v 3
v 5
v 4 v 6
v 7
30
30
60
15
15
20 20
25 18 图1 A 地区交通网络图
]
7[]
2[]
1[]
[...,D
D
D S D D
D
i i ⊗⊗⊗=*=-
则可得ij s 即为从节点i 到节点j 的所有路中距离最小者,即i 到j 的最短路。
其中,定义2种运算如下:
模型的求解
由权矩阵D ,通过Floyd 算法,用MA TLAB 求出了最短路矩阵S :
⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭
⎫ ⎝⎛=015
63
33
40
30
60
150481825154563480305063933318300203363
402550200205030156333200306045936350300S
则可得S 每个列向量中的最大值向量
()6348
9363506393
通过MATLAB 中的min1函数即可得到求得节点号6,即v6居民区为所求。
)
,min()(,)(,)()2()
,,,min()(,)(,)(12211ij ij ij n m ij n m ij n m ij lj il j i j i ij n
m ij n l jk l m ij b a d d B A D b B a A b a b a b a c c B A C b B a A ==⊗===+++==*===⨯⨯⨯⨯⨯⨯其中规定:已知矩阵其中:规定)已知矩阵(
附录
star.m
function P=star(A,B)
n=7;
P=[inf,inf,inf,inf,inf,inf,inf;inf,inf,inf,inf,inf,inf,inf;inf,inf,inf,inf,inf,inf,inf;inf,inf,inf,i nf,inf,inf,inf;inf,inf,inf,inf,inf,inf,inf;inf,inf,inf,inf,inf,inf,inf;inf,inf,inf,inf,inf,inf,inf]; for i=1:n
for j=1:n
for k=1:n
if A(i,k)+B(k,j)<P(i,j)
P(i,j)=A(i,k)+B(k,j);
end
end
end
end
disp(P);
plus1.m
function P=plus1(A,B)
n=7;
P=[inf,inf,inf,inf,inf,inf,inf;inf,inf,inf,inf,inf,inf,inf;inf,inf,inf,inf,inf,inf,inf;inf,inf,inf,i nf,inf,inf,inf;inf,inf,inf,inf,inf,inf,inf;inf,inf,inf,inf,inf,inf,inf;inf,inf,inf,inf,inf,inf,inf]; for i=1:n
for j=1:n
if A(i,j)<B(i,j)
P(i,j)=A(i,j);
else
P(i,j)=B(i,j);
end
end
end
disp(P);
min1.m
function s=min1(S)
n=7;
X=zeros(7);
s=X(1,:);
for i=1:n
s(i)=max(S(:,i));
end
x=min(s);
for j=1:n
if x==s(j)
disp(j);
end
end
>>
D=[inf,30,inf,inf,inf,inf,inf;30,inf,20,inf,inf,15,inf;inf,20,inf,20,60,25,inf;inf,inf,20,inf ,30,18,inf;inf,inf,60,30,inf,inf,inf;inf,15,25,18,inf,inf,15;inf,inf,inf,inf,inf,15,inf]
>> D2=star(D,D);
>> D3=star(D2,D);
>> D4=star(D3,D);
>> D5=star(D4,D);
>> D6=star(D5,D);
>> D7=star(D6,D);
>> S1=plus1(D,D2);
>> S2=plus1(S1,D3);
>> S3=plus1(S2,D4);
>> S4=plus1(S3,D5);
>> S5=plus1(S4,D6);
>> S6=plus1(S5,D7);
>>S=S6;
>> min1(S);。