车辆跟驰模型matlab代码实现_MATLAB——考虑驾驶员特性及前车速度的快速路模型...

重发一下之前误删的一篇~


目前大多数元胞自动机模型并没有考虑前车速度,大多数同向行驶的模型中车辆都是处在一个完全跟车的状态,无论前车是加速还是减速,后车驾驶者都只是根据自己的车速判断是减速跟驰还是变换车道来寻求寻求更合理的行驶状态。显然这与实际不符。

驾驶者是一个有自主意识的个体,每个个体都存在差异,即在驾驶过程中都有各自的偏好。对于不同驾驶员有不同的驾驶特性,驾驶员的驾驶特性是受其心理,生理,性格影响的及其复杂的驾驶行为偏好。对驾驶行为起到关键作用的有,反应时间,驾驶员对冒险驾驶行为的偏好,这两点都是引起交通事故的重要因素。驾驶员反应时间越长越易与前车发生碰撞;驾驶员对冒险行为的偏好越高,在驾驶时约越易采取偏激行为,引发交通事故。但值得注意的是,部分驾驶员对冒险驾驶行为的偏好是出于自身性格因素,但也有很大部分驾驶员对冒险驾驶行为的偏好是出于自身驾驶技术较高,也就是驾驶技术较高的驾驶员采取偏激驾驶行为的概率大于新手驾驶员,这是符合常识的。

因此,本模型引入驾驶员反应时间,冒险偏好参数,以及考虑前车速度来使元胞自动机在快速路模型的模拟中更加接近现实。其中,近似认为一个驾驶员其反应时间与冒险偏好参数之和为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 time=1: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 id=1:car_number%%  位置信息初始化if  id<=fix(car_number/3)%%  最左边车道随机投放车辆car.m(id) = 1;car.n(id) = fix( 1+rand(1)*(lane_length-1) );while space(car.m(id),car.n(id))==1car.n(id) = fix( 1+rand(1)*(lane_length-1) );endspace( 1,car.n(id) ) = 1;elseif  id<fix( (car_number*2)/3 )%%  中间车道随机投放车辆car.m(id) = 2;car.n(id) = fix( 1+rand(1)*(lane_length-1) );while space(car.m(id),car.n(id))==1car.n(id) = fix( 1+rand(1)*(lane_length-1) );endspace( 2,car.n(id) ) = 1;else%%  最右边车道投放车辆   car.m(id) = 3;car.n(id) = fix( 1+rand(1)*(lane_length-1) );while space(car.m(id),car.n(id))==1car.n(id) = fix( 1+rand(1)*(lane_length-1) );endspace( 3,car.n(id) ) = 1;end%%  车速及驾驶员特性初始化car.v(id) = fix( 1+rand(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 id=1: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) +empty+1)) .* (car.m==car.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_front+1)) .* (car.m==car.m(id)+1) ));%获取右前车速度elsev_front_right = v_max;end%%  换道决策if   empty+car.a(id)*v_front < car.v(id)*(1+car.r(id))%%  前车阻碍车辆对速度的追求if  (v_front_right*car.a(id)+empty_right_front) > (empty+car.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_front+1)) .* (car.m==car.m(id)+1) ));elsev_front_right = v_max;end%获取左前车速度if cycle_leftv_front_left = car.v( logical( (car.n==(car.n(id) +empty_left_front+1)) .* (car.m==car.m(id)-1) ));elsev_front_left = v_max;end%%  换道决策if  empty+car.a(id)*v_front < car.v(id)*(1+car.r(id))%%  前车阻碍车辆对速度的追求%%  优先左换道if  (v_front_left*car.a(id)+empty_left_front) > (empty+car.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) > (empty+car.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_front+1)) .* (car.m==car.m(id)-1) ));%获取左前车速度elsev_front_left = v_max;end%%  换道决策if  empty+car.a(id)*v_front < car.v(id)*(1+car.r(id))%%  前车阻碍车辆对速度的追求if  (v_front_left*car.a(id)+empty_left_front) > (empty+car.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) +empty+1)) .* (car.m==car.m(id)) ) );%获取前车速度elsev_front = v_max;endcar.v(id) = min (car.v(id) , fix(empty+car.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 = e+1;case 2car.n(id) = f;f = f+1;case 3car.n(id) = g;g = g+1;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;
cycle=1;
if  n+1 < lane_length%求前车距while space(m,n+empty_front) == 0if n+empty_front<lane_lengthempty_front = empty_front+1;elsecycle = 0;empty_front = empty_front+1;break;endend   empty_front = empty_front-1;
elseempty_front = 0;cycle = 0;
end
end

本来开专栏只是做个笔记,但陆续也有几个小伙伴加我,和他们交流发现了之前发的几个代码的好几处错误,所以希望看到代码中的错误或是某部分代码怎样写更好,希望大家能指点一二,十分感谢!

参考文献

李杰;杨晓芳;付强.分析驾驶行为的快速路交通流元胞自动机模型[J].物流科技,2018,v.41;No.280,69-73.

本模型主要思路就是上面这篇文章,加上知乎的编辑器我不太会用,所以我就没标引用的地方。公式编辑器编辑的公式也没法复制,所以一直都是文字叙述。总之这次模型就是基于上面文章的思路改的,但我感觉这篇文章有前后矛盾的地方,可以交流哈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux nc命令

参考 :http://www.linuxso.com/command/nc.html NC 全名 Netcat (网络刀)&#xff0c;作者是 Hobbit && ChrisWysopal。因其功能十分强大&#xff0c;体积小巧而出名&#xff0c;又被大家称为“瑞士军刀”。nc - TCP/IP swiss army knife nc 常用于溢出、反向链接、上传…

收藏一些自己认为好的网站或博客

月光博客 seo每天一贴 虎嗅网 李岩的博客 中邮阅读网&#xff0c;专门看电子期刊的&#xff0c;很不错的免费阅读期刊网。 seay web安全技术博客: http://www.cnseay.com 陆陆续续编辑中... 转载于:https://www.cnblogs.com/caoyuanzhanlang/archive/2013/01/05/2846086.html

shell 判断字符串相等_编程小短文:Bash子字符串还在用==?试试=~性能瞬间飙升100倍...

引言Bash 是 Linux 系统下钦定的 shell。你可以通过cat /etc/shells查看当前系统支持的 shell 种类。Bash 不但是系统管理员与内核交互的利器&#xff0c;且是一种语言&#xff0c;可以编写大多数系统的自动化脚本&#xff0c;用于简化运维工作。今天我们学习一个知识点&#x…

linux系统联网命令,Linux系统常用的网络命令及使用方法

Linux系统常用的网络命令及使用方法Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。下面小编整理了Linux系统常用的网络命令及使用方法&#xff0c;希望对大家有帮助!1、pingping命令工作在O…

Xss Csrf 简介

一、Js在web的执行环境 1.直接触发 •在HTML页中插入<script></script>脚本标记。JS嵌入到HTML中的两种方式&#xff1a; •1&#xff09;直接嵌入<script>标签 <script language“javascript”> document.write(“hello world!”); </script> •…

Cracking the Coding Interview 5.2

Given a(decimal -e.g. 3.72)number that is passed in as a string, print the binary representation. If the number can not be represented accurately in binary, print "ERROR" 整数部分&#xff1a; 对2取余&#xff0c;然后向右移动一位&#xff0c;重复直到…

python的render函数_带函数return的Flask render_模板

TL&#xff1b;DR在这种情况下&#xff0c;我想我会选择使用我现在的4个选项我将介绍4种选择&#xff0c;其中一些可能比其他更可行。在如果您担心execute表示的代码存在代码重复(DRY)&#xff0c;您可以简单地定义一个两个路由都可以调用的函数&#xff1a;def execute():# ex…

Google开源Leak Finder——用于检测内存泄漏的JavaScript工具

近日&#xff0c;Google开源了Leak Finder&#xff0c;这款工具可以查看JavaScript应用的堆&#xff0c;进而发现内存泄漏。 作为一门垃圾收集语言&#xff0c;JavaScript并不会出现常见的内存泄露情况&#xff0c;特别是像C等语言中所见到的那种。但如果依旧将内存分配给那些不…

linux 定时访问文件夹,Linux定时同步文件夹

-v, --verbose 详细模式输出-q, --quiet 精简输出模式-c, --checksum 打开校验开关&#xff0c;强制对文件传输进行校验-a, --archive 归档模式&#xff0c;表示以递归方式传输文件&#xff0c;并保持所有文件属性&#xff0c;等于-rlptgoD-r, --recursive 对子目录以递归模式处…

windows apache 开启 GZIP

从服务端优化来说&#xff0c;通过对服务端做压缩配置可以大大减小文本文件的体积&#xff0c;从而使加载文本的速度成倍的加快。目前比较通用的压缩方法是启用gzip压缩。它 会把浏览器请求的页面&#xff0c;以及页面中引用的静态资源以压缩包的形式发送到客户端,然后在客户端…

python必备插件_5框酷毙的python插件工具

展开全部工欲善其事必先利其器&#xff0c;一个好的工具能让起到事半功倍32313133353236313431303231363533e59b9ee7ad9431333433646531的效果&#xff0c;Python社区提供了足够多的优秀工具来帮助开发者更方便的实现某些想法&#xff0c;下面这几个工具给我的工作也带来了很多…

Bootstrap3 排版-改变大小写

通过这几个类可以改变文本的大小写。 <p class"text-lowercase">Lowercased text.</p> <p class"text-uppercase">Uppercased text.</p> <p class"text-capitalize">Capitalized text.</p> —–下面有个“顶…

linux系统如何调屏幕亮度,Linux入门教程:Ubuntu笔记本屏幕亮度调节

前天入手一台Dell笔记本&#xff0c;i7第五代处理器&#xff0c;8G内存&#xff0c;1T硬盘&#xff0c;很符合我对移动工作站的要求。今天果断将正版win8替换为Ubuntu&#xff0c;DIY的后果就是原来3秒启动系统变成了现在15秒&#xff0c;忍了。但是另一个问题十分困扰我&#…

Centos7 更新pip和scipy

更新pip&#xff1a; pip install --upgrade pip 更新scipy包&#xff1a; pip install -upgrade scipy 转载于:https://www.cnblogs.com/leewhite/p/6098211.html

poj 3258 River Hopscotch 【二分】

题目真是不好读&#xff0c;大意例如以下&#xff08;知道题意就非常好解了&#xff09; 大致题意&#xff1a; 一条河长度为 L&#xff0c;河的起点(Start)和终点(End)分别有2块石头&#xff0c;S到E的距离就是L。 河中有n块石头&#xff0c;每块石头到S都有唯一的距离 问如今…

python的socks5全局代理_Python写的Socks5协议代理服务器

直接上代码&#xff1a;#!/usr/bin/python# Filename s5.py# Python Dynamic Socks5 Proxy# Usage: python s5.py 1080# Background Run: nohup python s5.py 1080 &import socket, sys, select, SocketServer, struct, timeclass ThreadingTCPServer(SocketServer.Threadi…

Zencart 给DHL运费模块增加一个分区的方法

Zencart 给DHL运费模块增加一个分区的方法 zencart給DHL運費模塊添加一個分區的方法很簡單&#xff0c;因爲該模塊已經做好了允許用戶添加更多分區的設置。 具體方法如下&#xff1a; 首先打開該運費模塊&#xff08;includes\modules\shipping\dhlzones.php 文件&#xff09;&…

linux 如何查看终端格式,你应该还不知道,Linux终端下的 Markdown 文档查看器

原标题&#xff1a;你应该还不知道&#xff0c;Linux终端下的 Markdown 文档查看器现在&#xff0c;Markdown 差不多已经成为技术文档的标准。它可以实现技术文档的快捷写作&#xff0c;以及输出发布。同样都是标记语言&#xff0c;但Markdown 文档相比HTML更加简单。一是体现在…

更换硬盘

更换硬盘 1. 根据管理平台的信息&#xff0c;找到损坏磁盘的位置 2. 取下坏盘&#xff0c;对比新盘的PN号 3. 将新的硬盘插回到磁盘柜 4. vol status -s 查看Spare Disks信息 &#xff0c;找到识别码&#xff0c;例如4a.05.15 5. disk assign 4…

Android之 Fragment

什么是Fragment&#xff1a; Android是在Android 3.0 (API level 11)开始引入Fragment的。 可以把Fragment想成Activity中的模块&#xff0c;这个模块有自己的布局&#xff0c;有自己的生命周期&#xff0c;单独处理自己的输入&#xff0c;在Activity运行的时候可以加载或者移除…