做网站业务员,广州番禺最新消息,中石油七建设公司官网,网站子站建设自查报告重发一下之前误删的一篇~目前大多数元胞自动机模型并没有考虑前车速度#xff0c;大多数同向行驶的模型中车辆都是处在一个完全跟车的状态#xff0c;无论前车是加速还是减速#xff0c;后车驾驶者都只是根据自己的车速判断是减速跟驰还是变换车道来寻求寻求更合理的行驶状态…重发一下之前误删的一篇~目前大多数元胞自动机模型并没有考虑前车速度大多数同向行驶的模型中车辆都是处在一个完全跟车的状态无论前车是加速还是减速后车驾驶者都只是根据自己的车速判断是减速跟驰还是变换车道来寻求寻求更合理的行驶状态。显然这与实际不符。驾驶者是一个有自主意识的个体每个个体都存在差异即在驾驶过程中都有各自的偏好。对于不同驾驶员有不同的驾驶特性驾驶员的驾驶特性是受其心理生理性格影响的及其复杂的驾驶行为偏好。对驾驶行为起到关键作用的有反应时间驾驶员对冒险驾驶行为的偏好这两点都是引起交通事故的重要因素。驾驶员反应时间越长越易与前车发生碰撞驾驶员对冒险行为的偏好越高在驾驶时约越易采取偏激行为引发交通事故。但值得注意的是部分驾驶员对冒险驾驶行为的偏好是出于自身性格因素但也有很大部分驾驶员对冒险驾驶行为的偏好是出于自身驾驶技术较高也就是驾驶技术较高的驾驶员采取偏激驾驶行为的概率大于新手驾驶员这是符合常识的。因此本模型引入驾驶员反应时间冒险偏好参数以及考虑前车速度来使元胞自动机在快速路模型的模拟中更加接近现实。其中近似认为一个驾驶员其反应时间与冒险偏好参数之和为1。也就是说用驾驶员反应时间来粗略代表其驾驶技术水平而认为随着其驾驶水平提高其对冒险驾驶行为的偏好相应增高。而对前车速度的考虑则通过定义驾驶需要空间和驾驶员预估空间来实现。其中驾驶需要空间是指车辆此时刻速度车辆反应时间*车辆此时速度即车辆可以保持速度行为而不发生碰撞所需要的空间驾驶员预估空间是指车辆与前车距离驾驶员冒险偏好参数*前车速度即驾驶员对未来车前距离的预估。依据以上思路对NaSch模型的加速规则进行更改当驾驶需要空间驾驶员预估空间时车辆进行减速即车辆速度在车辆现速度与驾驶员预估空间减去反应时间走过的距离之间取小。相应的换道决策过程是当车辆驾驶所需空间驾驶员预估空间而旁边车道的驾驶员预估空间大于本车道时将以概率换道这里的概率换道也是模拟驾驶员特性反应其对速度的追求。综上考虑了反应时间后后车对前方行驶空间要求相对NaSch模型变大而考虑前车速度让后车在加减速判断时放大了车间距这个概念而反应时间和驾驶员对前方空间的预估都和驾驶员特性有关这和实际情况是符合的。而驾驶员对冒险偏好参数是初始化的时候就随机生成不变的代表不同驾驶员的不同性格这与实际相符。而反应时间和冒险偏好参数之和为1是方便编程之举但粗略来说也是和实际大致符合的。值得注意的是本模型中依据采取先换道再跟驰的方法而换道是有顺序的跟驰无顺序也就是说换道是一辆车换道结束之后下一辆车再换道这必然造成一辆车的换道行为将影响之后车辆的换道行为而跟驰则不然所有车辆执行完加减速及随机慢化后同时位置更新即所有车辆在一个时间步内行进时无影响。车辆换道对其他车辆换道跟驰产生影响是符合实际情况的而在一个时间步对应现实时间比较小的情况下车辆跟驰行为间无影响也是符合现实的。除此以外本模型中头车不受前车影响而减速也不换道这也是与实际相符的。引入前车速度使本模型与NaSch有很大的区别一是一个位置可能会出现两辆车所以在位置更新时要防止碰撞而多做一个判断另一个是一个时间步内可以有多辆车驶出车道。最后本模型车辆换道时没有考虑目标车道后车影响但实际换道时肯定受到与后车距离以及后车速度的综合影响但其影响明显小于前车影响而为了编程方便并没有考虑。贴代码哈。主函数%% 考虑驾驶员特性和前车速度的单向3车道模型
clc;
clear;
%% 参数设置
lane_length 100; %车道长度
car_rate 0.1; %车辆占有率
v_max 5; %最大车速
time_max 1000; %仿真步长
time_span 0.1; %仿真图片输出间隔
p_slowdown 0.3; %随机慢化概率
p_changelane 0.8; %满足换道条件换道概率%% 随机生成初始车辆信息
[space,car,car_number] initialize(car_rate,lane_length,v_max);%% 显示初始仿真图
figure(doublebuffer,on);%开启双缓存
space -1*space;
H imshow(space,[]);
title(考虑驾驶员特性及前车速度的单向3车道模型,color,red);
space -1*space;%% 开始仿真
for time1:time_max%% 换道阶段[car,space] change_lane(space,car,car_number,p_changelane,lane_length,v_max);%% 跟驰阶段[space,car] follow(space,car,v_max,lane_length,p_slowdown,car_number);%% 显示仿真图space -1*space;set(H,CData,space);pause(time_span);space -1*space;
end初始化函数function [space,car,car_number] initialize(car_rate,lane_length,v_max)
car_number fix(1(3*lane_length-1)*car_rate); %按车辆占有率算出的车辆数
%% 创建空间
space zeros(3,lane_length);%元胞空间
car struct(v,zeros(1,car_number),m,zeros(1,car_number),n,zeros(1,car_number),r,zeros(1,car_number),a,zeros(1,car_number));
% 车辆信息结构体从左到右为速度车道列反应时间驾驶员对冒险驾驶行为的偏好
%% 随机生成初始车辆信息
for id1:car_number%% 位置信息初始化if idfix(car_number/3)%% 最左边车道随机投放车辆car.m(id) 1;car.n(id) fix( 1rand(1)*(lane_length-1) );while space(car.m(id),car.n(id))1car.n(id) fix( 1rand(1)*(lane_length-1) );endspace( 1,car.n(id) ) 1;elseif idfix( (car_number*2)/3 )%% 中间车道随机投放车辆car.m(id) 2;car.n(id) fix( 1rand(1)*(lane_length-1) );while space(car.m(id),car.n(id))1car.n(id) fix( 1rand(1)*(lane_length-1) );endspace( 2,car.n(id) ) 1;else%% 最右边车道投放车辆 car.m(id) 3;car.n(id) fix( 1rand(1)*(lane_length-1) );while space(car.m(id),car.n(id))1car.n(id) fix( 1rand(1)*(lane_length-1) );endspace( 3,car.n(id) ) 1;end%% 车速及驾驶员特性初始化car.v(id) fix( 1rand(1)*(v_max-1) ); %速度初始化car.r(id) rand(1); %随机生成驾驶员反应时间和对冒险驾驶行为的偏好参数均为0到1间数字car.a(id) 1-car.r(id);end
end
换道函数function [car,space] change_lane(space,car,car_number,p_changelane,lane_length,v_max)
%换道函数
for id1:car_number[cycle,empty]get_empty_front(car.m(id),car.n(id),lane_length,space);%获取前方车距if cycle %头车不换道v_front car.v( logical( (car.n(car.n(id) empty1)) .* (car.mcar.m(id)) ) );%获取前车速度if car.m(id) 1 %左侧车道换道[cycle_right,empty_right_front] get_empty_front(car.m(id)1,car.n(id),lane_length,space);%获取右侧车道车距if cycle_rightv_front_right car.v( logical( (car.n(car.n(id) empty_right_front1)) .* (car.mcar.m(id)1) ));%获取右前车速度elsev_front_right v_max;end%% 换道决策if emptycar.a(id)*v_front car.v(id)*(1car.r(id))%% 前车阻碍车辆对速度的追求if (v_front_right*car.a(id)empty_right_front) (emptycar.a(id)*v_front) space( car.m(id)1,car.n(id) )0 %旁边车道距离更大且旁边无车%% 满足安全条件换道if rand(1)p_changelane %满足换道条件以概率换道space(car.m(id),car.n(id)) 0;car.m(id) car.m(id)1;space(car.m(id),car.n(id)) 1;endendendelseif car.m(id) 2 %中间车道换道[cycle_right,empty_right_front] get_empty_front(car.m(id)1,car.n(id),lane_length,space);%获取右侧车道车距[cycle_left,empty_left_front] get_empty_front(car.m(id)-1,car.n(id),lane_length,space);%获取左侧车道车距%获取右前车速度if cycle_rightv_front_right car.v( logical( (car.n(car.n(id) empty_right_front1)) .* (car.mcar.m(id)1) ));elsev_front_right v_max;end%获取左前车速度if cycle_leftv_front_left car.v( logical( (car.n(car.n(id) empty_left_front1)) .* (car.mcar.m(id)-1) ));elsev_front_left v_max;end%% 换道决策if emptycar.a(id)*v_front car.v(id)*(1car.r(id))%% 前车阻碍车辆对速度的追求%% 优先左换道if (v_front_left*car.a(id)empty_left_front) (emptycar.a(id)*v_front) space( car.m(id)-1,car.n(id) )0 %旁边车道距离更大且旁边无车%% 满足安全条件换道if rand(1)p_changelane %满足换道条件以概率换道space(car.m(id),car.n(id)) 0;car.m(id) car.m(id)-1;space(car.m(id),car.n(id)) 1;endelse%左换道条件不满足则右换道if (v_front_right*car.a(id)empty_right_front) (emptycar.a(id)*v_front) space( car.m(id)1,car.n(id) )0 %旁边车道距离更大且旁边无车%% 满足安全条件换道if rand(1)p_changelane %满足换道条件以概率换道space(car.m(id),car.n(id)) 0;car.m(id) car.m(id)1;space(car.m(id),car.n(id)) 1;endendendendelse %右侧车道换道[cycle_left,empty_left_front] get_empty_front(car.m(id)-1,car.n(id),lane_length,space);%获取左侧车道车距if cycle_leftv_front_left car.v( logical( (car.n(car.n(id) empty_left_front1)) .* (car.mcar.m(id)-1) ));%获取左前车速度elsev_front_left v_max;end%% 换道决策if emptycar.a(id)*v_front car.v(id)*(1car.r(id))%% 前车阻碍车辆对速度的追求if (v_front_left*car.a(id)empty_left_front) (emptycar.a(id)*v_front) space( car.m(id)-1,car.n(id) )0 %旁边车道距离更大且旁边无车%% 满足安全条件换道if rand(1)p_changelane %满足换道条件以概率换道space(car.m(id),car.n(id)) 0;car.m(id) car.m(id)-1;space(car.m(id),car.n(id)) 1;endendendendend
end跟驰函数function [space,car] follow(space,car,v_max,lane_length,p_slowdown,car_number)
%跟驰函数
cycle zeros(1,car_number);%储存车辆是否为头车
for id 1:car_number%% 加速car.v(id) min(car.v(id)1,v_max);%% 获取车辆前空元胞数以及是否符合满足周期循环[cycle(id),empty]get_empty_front(car.m(id),car.n(id),lane_length,space);%% 减速if cycle %头车不受前车影响而减速if cycle(id) %获取前车速度v_front car.v( logical( (car.n(car.n(id) empty1)) .* (car.mcar.m(id)) ) );%获取前车速度elsev_front v_max;endcar.v(id) min (car.v(id) , fix(emptycar.a(id)*v_front-car.v(id)*car.r(id)) );%车速不能超过驾驶员预估空间end%% 概率慢化if rand(1) p_slowdowncar.v(id) max( car.v(id)-1,0 );end
end%% 位置更新e 2;f 2;g 2;for id 1:car_numberif car.n(id)v_max lane_length %会驶出车道%% 周期边界条件将头车以原速度道路最左边if cycle(id)0 %头车if car.n(id)car.v(id)lane_lengthspace ( car.m(id),car.n(id) ) 0;car.n(id) 1;space ( car.m(id),car.n(id) ) 1;endelse %非头车if car.n(id)car.v(id)lane_lengthspace ( car.m(id),car.n(id) ) 0;switch car.m(id)case 1car.n(id) e;e e1;case 2car.n(id) f;f f1;case 3car.n(id) g;g g1;endspace ( car.m(id),car.n(id) ) 1;end endspace ( car.m(id),car.n(id) ) 0;car.n(id) car.n(id) car.v(id);while space ( car.m(id),car.n(id) ) 1car.n(id) car.n(id) -1;endspace ( car.m(id),car.n(id) ) 1;else %不可能驶出车道space ( car.m(id),car.n(id) ) 0; car.n(id) car.n(id) car.v(id);while space ( car.m(id),car.n(id) ) 1car.n(id) car.n(id) -1;endspace ( car.m(id),car.n(id) ) 1;endend
end获取前车距离及判断是否头车函数%用于求m车道n列的前车距以及判断是否为头车cycle值为0是头车
function [cycle,empty_front] get_empty_front(m,n,lane_length,space)
empty_front 1;
cycle1;
if n1 lane_length%求前车距while space(m,nempty_front) 0if nempty_frontlane_lengthempty_front empty_front1;elsecycle 0;empty_front empty_front1;break;endend empty_front empty_front-1;
elseempty_front 0;cycle 0;
end
end本来开专栏只是做个笔记但陆续也有几个小伙伴加我和他们交流发现了之前发的几个代码的好几处错误所以希望看到代码中的错误或是某部分代码怎样写更好希望大家能指点一二十分感谢参考文献李杰;杨晓芳;付强.分析驾驶行为的快速路交通流元胞自动机模型[J].物流科技,2018,v.41;No.280,69-73.本模型主要思路就是上面这篇文章加上知乎的编辑器我不太会用所以我就没标引用的地方。公式编辑器编辑的公式也没法复制所以一直都是文字叙述。总之这次模型就是基于上面文章的思路改的但我感觉这篇文章有前后矛盾的地方可以交流哈。