2013年国赛高教杯数学建模
A题 车道被占用对城市道路通行能力的影响
车道被占用是指因交通事故、路边停车、占道施工等因素,导致车道或道路横断面通行能力在单位时间内降低的现象。由于城市道路具有交通流密度大、连续性强等特点,一条车道被占用,也可能降低路段所有车道的通行能力,即使时间短,也可能引起车辆排队,出现交通阻塞。如处理不当,甚至出现区域性拥堵。
车道被占用的情况种类繁多、复杂,正确估算车道被占用对城市道路通行能力的影响程度,将为交通管理部门正确引导车辆行驶、审批占道施工、设计道路渠化方案、设置路边停车位和设置非港湾式公交车站等提供理论依据。
视频1(附件1)和视频2(附件2)中的两个交通事故处于同一路段的同一横断面,且完全占用两条车道。请研究以下问题:
1. 根据视频1(附件1),描述视频中交通事故发生至撤离期间,事故所处横断面实际通行能力的变化过程。
2. 根据问题1所得结论,结合视频2(附件2),分析说明同一横断面交通事故所占车道不同对该横断面实际通行能力影响的差异。
3. 构建数学模型,分析视频1(附件1)中交通事故所影响的路段车辆排队长度与事故横断面实际通行能力、事故持续时间、路段上游车流量间的关系。
4. 假如视频1(附件1)中的交通事故所处横断面距离上游路口变为140米,路段下游方向需求不变,路段上游车流量为1500pcu/h,事故发生时车辆初始排队长度为零,且事故持续不撤离。请估算,从事故发生开始,经过多长时间,车辆排队长度将到达上游路口。
附件1:视频1
附件2:视频2
附件3:视频1中交通事故位置示意图
附件4:上游路口交通组织方案图
附件5:上游路口信号配时方案图
注:只考虑四轮及以上机动车、电瓶车的交通流量,且换算成标准车当量数。
整体求解过程概述(摘要)
交通是城市的命脉。车道往往会因为交通事故等原因被占用,从而降低了道路的通行能力,严重的话会导致交通堵塞。为了帮助交通管理部门更好地管理城市交通,需要正确估算车道被占用对城市道路通行能力的影响程度。 为了更准确地计算视频中上流路口进入事发路段的车辆和通过交通事故所占车道的横断面的车辆情况,本文在使用了背景差分法为主,直方图均衡化、中值滤波法、、形态学滤波法和边缘检测算法为辅的图像处理方法得到检测运动车辆的视频,使计算更简便。
针对问题一,根据权威文献计算出事故发生期间事故所处横断面理论通行能力和实际通行能力,由两种通行能力随时间变化的图像可知实际通行能力在事故期间随时间在理论通行能力上下波动,而且这种波动符合正态分布。
针对问题二,在视频一和视频二的数据通过正态检验和方差齐次检验后,利用这些数据使用方差分析得到同一横断面交通事故所占车道不同对该横断面实际通行能力的影响无显著性差异的结论。为了得到这种影响的实际情况,本文又进一步使用了通径分析,得到的结果为同一横断面交通事故所占车道不同对横断面实际通行能力的影响决定于各车道的流量比例。
针对问题三,首先使用城市交通二流理论计算得到事发路段随事故持续时间增加而改变的排队长度,然后使用非线性比例尺改进算法统计视频的排队长度。然后用夹角余弦法对事故横断面实际通行能力、路段上游车流量分配权重统一为一个自变量,和事故持续时间一同作为BP神经网络的输入样本,排队长度作为输出样本进行训练,得到一个拥挤交通流排队长度模型。最后用遗传算法对神经网络进行优化。模型的结果和样本数据拟合效果较好,显示排队长度会随着排队时间变大,路段上游车流量变大,事故横断面实际通行能力下降而不断增加。
针对问题四,将车看作元胞,根据所给的数据制定元胞运动规则,构造出基于元胞自动机的交通流预测模型。经过模拟仿真,得到的结果为:事故发生后,在上游车流量波动不大的情况下,经过8.3分钟到9分钟之间的时间,车辆排队长度将到达上游路口。对模型进行改进,考虑红绿灯的情况,得到车辆排队长度达到上游路口的时间缩短为8分到8.4分钟之间,平均时间为8.36分钟,且排队长度曲线的波动程度变大。
模型假设:
1. 只考虑四轮及以上机动车、电瓶车的交通流量,且换算成标准车当量数。
2. 车只分为小、中、大三种车型,小轿车、小型客货车为小型,中型客货车、轻型客货车为中型,大型货车、大型客车为大型,且同一车型的车大小相差不大。
3. 上游车流量不受事故持续时间影响。
问题重述:
车道被占用是指因交通事故、路边停车、占道施工等因素,导致车道或道路横断面通行能力在单位时间内降低的现象。由于城市道路具有交通流密度大、连续性强等特点,一条车道被占用,也可能降低路段所有车道的通行能力,即使时间短,也可能引起车辆排队,出现交通阻塞。如处理不当,甚至出现区域性拥堵。 车道被占用的情况种类繁多、复杂,正确估算车道被占用对城市道路通行能力的影响程度,将为交通管理部门正确引导车辆行驶、审批占道施工、设计道路渠化方案、设置路边停车位和设置非港湾式公交车站等提供理论依据。 视频1(附件1)和视频2(附件2)中的两个交通事故处于同一路段的同一横断面,且完全占用两条车道。请研究以下问题:
1. 根据视频1(附件1),描述视频中交通事故发生至撤离期间,事故所处横断面实际通行能力的变化过程。
2. 根据问题1所得结论,结合视频2(附件2),分析说明同一横断面交通事故所占车道不同对该横断面实际通行能力影响的差异。
3. 构建数学模型,分析视频1(附件1)中交通事故所影响的路段车辆排队长度与事故横断面实际通行能力、事故持续时间、路段上游车流量间的关系。
4. 假如视频1(附件1)中的交通事故所处横断面距离上游路口变为140米,路段下游方向需求不变,路段上游车流量为1500pcu/h,事故发生时车辆初始排队长度为零,且事故持续不撤离。请估算,从事故发生开始,经过多长时间,车辆排队长度将到达上游路口。
模型的建立与求解整体论文缩略图
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
程序代码:
% 计算队列长度
function [cal] = calline(road)
global length DU;
cals = zeros(1,3);
for i = 2:4
for j = 2:length-1
if road(i,j) == DU && road(i,j+1) == DU
cals(i-1) = cals(i-1)+1;
end
end
end
cal = max(cals);
end
function ret=Code(lenchrom,bound)
%本函数将变量编码成染色体,用于随机初始化一个种群
% lenchrom input : 染色体长度
% bound input : 变量的取值范围
% ret output: 染色体的编码值
flag=0;
while flag==0
pick=rand(1,length(lenchrom));
ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; %线性插值,编码结果以实数向量存入ret中
flag=test(lenchrom,bound,ret); %检验染色体的可行性
end
function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)
%本函数完成交叉操作
% pcorss input : 交叉概率
% lenchrom input : 染色体的长度
% chrom input : 染色体群
% sizepop input : 种群规模
% ret output : 交叉后的染色体
for i=1:sizepop %每一轮for循环中,可能会进行一次交叉操作,染色体是随机选择的,交叉位置也是随机选择的,%但该轮for循环中是否进行交叉操作则由交叉概率决定(continue控制)
% 随机选择两个染色体进行交叉
pick=rand(1,2);
while prod(pick)==0
pick=rand(1,2);
end
index=ceil(pick.*sizepop);
% 交叉概率决定是否进行交叉
pick=rand;
while pick==0
pick=rand;
end
if pick>pcross
continue;
end
flag=0;
while flag==0
% 随机选择交叉位
pick=rand;
while pick==0
pick=rand;
end
pos=ceil(pick.*sum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同
pick=rand; %交叉开始
v1=chrom(index(1),pos);
v2=chrom(index(2),pos);
chrom(index(1),pos)=pick*v2+(1-pick)*v1;
chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束
flag1=test(lenchrom,bound,chrom(index(1),:)); %检验染色体1的可行性
flag2=test(lenchrom,bound,chrom(index(2),:)); %检验染色体2的可行性
if flag1*flag2==0
flag=0;
else flag=1;
end %如果两个染色体不是都可行,则重新交叉
end
end
ret=chrom;
function ret=Decode(lenchrom,bound,code,opts)
% 本函数对染色体进行解码
% lenchrom input : 染色体长度
% bound input : 变量取值范围
% code input :编码值
% opts input : 解码方法标签
% ret output: 染色体的解码值
switch opts
case 'binary' % binary coding
for i=length(lenchrom):-1:1
data(i)=bitand(code,2^lenchrom(i)-1); %并低十位,然后将低十位转换成十进制数存在data(i)里面
code=(code-data(i))/(2^lenchrom(i)); %低十位清零,然后右移十位
end
ret=bound(:,1)'+data./(2.^lenchrom-1).*(bound(:,2)-bound(:,1))'; %分段解码,以实数向量的形式存入ret中
case 'grey' % grey coding
for i=sum(lenchrom):-1:2
code=bitset(code,i-1,bitxor(bitget(code,i),bitget(code,i-1)));
end
for i=length(lenchrom):-1:1
data(i)=bitand(code,2^lenchrom(i)-1);
code=(code-data(i))/(2^lenchrom(i));
end
ret=bound(:,1)'+data./(2.^lenchrom-1).*(bound(:,2)-bound(:,1))'; %分段解码,以实数向量的形式存入ret中
case 'float' % float coding
ret=code; %解码结果就是编码结果(实数向量),存入ret中
end