【穷举法】应急设施位置选取的程序实现
1.问题的提出
里奥兰翘镇迄今没有自己的应急设施,1986年该镇得到了建立两个应急设施的安全拨款。每个设施都把救护站、消防队和警察所合在一起。
如图(1)指出了1985年每个长方形街区应急事件的次数。在北边的L形状的区域是一个障碍,在南边的长方形区域是一个有浅水塘的公园。应急车辆驶过一南北向的街道平均要花15秒,而通过一条东西向的街道平均要花20秒。
- 假定需求集中在每个街道的中心而应急设施位于街角处。
- 假定需求沿每个街区的街道上平均分布的,而应急设施可以位于街道的任何地方。
2.模型假设
- 假设需求集中在每个街区的中心,应急设施位于街角处;
- 假设在同一街区不会同时发生两个事件;
- 假设1985年的应急次数具有典型性,未来的需求分布不会和1985年相差太远;
- 应急车辆的响应时间只考虑在街道上行驶时间,其他因素(如转弯、街区内部行车时间)可以忽略不计;
- 假设两个应急设施的功能完全相同,当应急事件出现时,只要从离事件发生地点最近的应急设施派出应急车辆即可;
- 执行任何一次应急任务的车辆都从某一个应急设施出发,完成任务后回到原设施。不出现从一个应急事件点直接到另一个应急事件发生点的情况(这是由于每个地点发生事件的概率都很小,因此两个地点同时发生事故的概率就更小,因此可以忽略这种情况)。
3.模型的建立与求解
3.1模型建立
1.如下图所示,建立里奥兰翘镇的平面直角坐标系
2.设两个应急设施的坐标分别为(x1,y1),(x2,y2)
3.现对我们需要计算的指标作如下规定:
- 一个位置点对某一街区发生事件的响应时间 = 位置点到街区的街道数×车辆行驶一条街道的时间×该街区发生事件的次数
- 一个位置点对全镇所有应急事件响应的总时间 = 该位置点对所有街区应急事件响应时间的总和
- 一个位置点对全镇任一次应急事件的平均响应时间 = 总响应时间 / 事件总数
4.两个应急设施到任一街区P(x,y)的时间:
5.该街区到最邻近的一个设施所需时间为:
6.总响应时间:
7.取平均响应时间最小所对应的位置点为应急设施的位置
3.2程序实现
3.2.1 C语言源程序代码
#include<stdio.h>
#include<math.h>
static const double ptime[10][5]={
{3,1,4,2,5},
{3,2,3,3,2},
{2,0,3,3,2},
{5,0,0,3,1},
{3,4,3,3,5},
{2,3,4,4,0},
{1,2,0,1,3},
{0,2,0,3,2},
{3,0,0,0,4},
{3,1,0,4,2}};
double sum=108.0;
double tval(int x,int y)
{
double ans=0,t1=0,t2=0;
for(int i=0;i<=9;i++)
{
for(int j=0;j<=4;j++)
{
ans = ans + (15*fabs(x-(i+0.5)) + 20*fabs(y-(i+0.5)) -17.5)*ptime[i][j] ;
//ans = ans + (15*fabs(x-i) + 20*fabs(y-i))*ptime[i][j] ;(应急事件发生在街区四周)
}
}
ans=ans/sum ;
return ans;
}
int main()
{
double sum=0,min=999999,tt=0;
for(int m=0;m<=9;m++)
{
for(int n=0;n<=4;n++)
{
sum+=ptime[m][n];
}
}
for(int i=0;i<=9;i++)
{
for(int j=0;j<=4;j++)
{
double tt=tval(i,j);
if(tt<min)
{
min=tt;
}
printf("坐标(%d,%d)的响应时间为:%f \n",i,j,tt);
}
}
printf("其中最小的为:%f\n",min);
getchar();
return 0;
}
3.2.2 程序运行结果
3.3结果分析
如表(1)是用程序得到的各个点到任一街区P(x,y)的平均响应时间,其中点(4,4)和(5,4)是平均响应时间最小所对应的位置点。
故选取(4,4)和(5,4)作为两个应急设施的位置点。如图(4)是应急设施在平面坐标上的位置示意图。
4.模型评价
- 模型对于障碍物没有充分考虑,如果已知更多关于障碍物的信息,结果可以做的更好
- 模型忽略了转弯次数对时间的影响,但该假设不会给结果带来太大的偏差
- 仅根据1985年一年的数据来判断该区域突发事件的频数不大具有代表性,如果根据几年的数据来充分考虑,会更有参考性