車輛跟馳模型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.pswp.cn/news/260114.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260114.shtml
英文地址,請注明出處:http://en.pswp.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運行的時候可以加載或者移除…