交通流元胞自动机程序

更新时间:2023-10-20 04:31:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

% 车流密度不变下的多车道仿真(包括单车道) % nc:车道数目(1或2),nl:车道长度

% v:平均速度,d:换道次数(1000次)p:车流密度 % dt:仿真步长时间,nt:仿真步长数目 % fp:车道入口处新进入车辆的概率 v = 0;p=0;d=0; nl = 100;nc = 1; dt=0.01;nt=1000; fp = 0.5;

[ v d p ] = multi_driveway( nl,nc,fp,dt,nt );

function [ v d p ] = multi_driveway( nl,nc,fp,dt,nt )

% 在某一特定车流密度下的(车流密度由fp决定)单、双车道仿真模型 % nc:车道数目(1或2),nl:车道长度——输入参数

% v:平均速度,d:换道次数(1000次)p:车流密度——输出参数 % dt:仿真步长时间,nt:仿真步长数目——输入参数 % fp:车道入口处新进入车辆的概率——输入参数 % test:

% nl = 400;fp = 0.5;

% nc = 2;dt=0.01;nt=500; %构造元胞矩阵

B=ones(2*nc+1,nl+2); %奇数行为不可行车道 B(1:2:(2*nc+1),:)=1.2;

%初始化仿真元胞状态(1为无车,0为有车)

bb=B(2:2:2*nc,:);bb(bb~=0)=1;B(2:2:2*nc,:)=bb;B(2:2:2*nc,end)=0; %显示初始交通流图 figure(1);

H=imshow(B,[]);

set(gcf,'position',[241 132 560 420]) ;$1 132 560 420 set(gcf,'doublebuffer','on'); $1

title('cellular-automation to traffic modeling','color','b'); %初始化化存储元胞上车辆状态的矩阵 S(1:nc,nl) = 0; Q(1:nc,1:2) = 0;

Acc(1:nc,1:(nl+2))=0;

%初始化换道频率、平均速度、车流密度相关变量 ad = 0;

av(1:nt) = 0; ap(1:nt) = 0; c = 1;

for n = 1:nt

A=B(2:2:2*nc,:);

%确定前n-2个车辆的状态 S(:,:) = 0;

S(A(:,1:end-2)==0&A(:,2:end-1)==1&A(:,3:end)==1)=2;%加速的车 S(A(:,1:end-2)==0&A(:,2:end-1)==0)=3;%停车的车

S(A(:,1:end-2)==0&A(:,2:end-1)==1&A(:,3:end)==0)=1;%减速行驶的车 %确定最后2两个元胞的状态 Q(:,:) = 0;

Q(A(:,end-1)==0&A(:,end)==0) = 1; Q(A(:,end-1)==0&A(:,end)==1) = 2; Q(A(:,end-1)==1&A(:,end)==0) = 2; Q(:,end) = 1;

%获得所有元胞上车辆的状态 Acc = [ S Q ]; %换路规则

if(nc>1&&n>nl/2)

%遍历每一个元胞

for g = 1:length(Acc(1,:))

%停车状态车辆如另一条路有2空位则换路

if( Acc(1,g)==3&&Acc(2,g)==0&&Acc(2,g+1)==0) A(1,g)=1; A(2,g)=0; ad=ad+1;

elseif( Acc(2,g)==3&&Acc(1,g)==0&&Acc(1,g+1)==0 ) A(1,g)=0; A(2,g)=1; ad=ad+1;

%均速行驶车辆如另一条路有3空位则换路

elseif( Acc(1,g)==1&&Acc(2,g)==0&&Acc(2,g+1)==0&&Acc(2,g+1)==0 ) A(1,g)=1; A(2,g)=0; ad =ad+1;

elseif( Acc(2,g)==1&&Acc(1,g)==0&&Acc(1,g+1)==0&&Acc(1,g+1)==0 ) A(1,g)=0; A(2,g)=1; ad=ad+1; end end

%换路后重新设置元胞上的车辆状态 S(:,1:end) = 0;

S(A(:,1:end-2)==0&A(:,2:end-1)==1&A(:,3:end)==1)=2;%寻找加速的车 S(A(:,1:end-2)==0&A(:,2:end-1)==0)=3;%寻找停车的车

S(A(:,1:end-2)==0&A(:,2:end-1)==1&A(:,3:end)==0)=1;%寻找减速行驶的车 %确定最后2两个元胞的状态 Q(:,1:end) = 0;

Q(A(:,end-1)==0&A(:,end)==0) = 1;% Q(A(:,end-1)==0&A(:,end)==1) = 2; Q(A(:,end-1)==1&A(:,end)==0) = 2; Q(:,end) = 1;

%获得所有元胞状态 Acc = [ S Q ]; end

%根据当前状态改变元胞位置 %匀速运行车辆向前走1格 A( Acc(:,1:end)==1 ) = 1;

A( [ zeros(nc,1) Acc(:,1:end-1)]==1 ) = 0; %高速运行车辆向前走2格 A( Acc(:,1:end)==2) = 1;

A( [ zeros(nc,2) Acc(:,1:end-2)]==2) = 0;

%计算平均速度、换道频率、车流密度等参数 %获得运行中的车辆数目N matN = A<1;

N = sum(sum(matN));

%获得运行中的车辆速度之和V E = S((S==1)|(S==2)); V = sum(E);

%计算此时刻的车流密度并保存 ap(n) = N/( nc*(nl+2) );

%计算此时刻的平均速率并保存 if(N~=0&&n>nl/2) av(c) = V/N; c = c+1; end

%在车道入口处随机引入新的车辆

A = [ round(fp*rand(nc,1))&A(1:nc,1) A(:,2:end)]; A(A~=0)=1;

%将新的车辆加入元胞矩阵中 B(2:2:2*nc,:)=A; %显示交通流图 set(H,'CData',B); %仿真步长 pause(dt); end

%仿真结束,计算结果 d = ad;

p = mean(ap);

v = sum(av)/c; end

%初始化仿真参量 v = 0;p=0;d=0; nl = 100;

nc = 2;dt=0.01;nt=1000; n=1; fp = 1.2;

[ v d p ] = multi_driveway( nl,nc,fp,dt,nt );

% 车流密度变化时的单车道仿真程序 % nc:车道数目(1或2),nl:车道长度

% v:平均速度,d:换道次数(1000次)p:车流密度 % dt:仿真步长时间,nt:仿真步长数目 % fp:车道入口处新进入车辆的概率 v = 0;p=0;d=0; nl = 100;

nc = 1;dt=0.01;nt=1000; n=1;

for fp = 2.5:-0.25:0.5

[ v d p ] = multi_driveway( nl,nc,fp,dt,nt ); va(n) = v; pa(n) = p; da(n) = d; n=n+1;

%绘制平均速率-车流密度(v-p)曲线 figure(2) plot(pa,va);

%绘制车流密度的变化曲线 figure(3) plot(pa); end

clf clear all %build the GUI

Tfine the plot button

plotbutton=uicontrol('style','pushbutton',... 'string','Run', ... 'fontsize',12, ...

'position',[100,400,50,20], ...

'callback', 'run=1;'); Tfine the stop button

erasebutton=uicontrol('style','pushbutton',... 'string','Stop', ... 'fontsize',12, ...

'position',[200,400,50,20], ... 'callback','freeze=1;'); Tfine the Quit button

quitbutton=uicontrol('style','pushbutton',... 'string','Quit', ... 'fontsize',12, ...

'position',[300,400,50,20], ... 'callback','stop=1;close;');

number = uicontrol('style','text', ... 'string','1', ... 'fontsize',12, ...

'position',[20,400,50,20]); ê setup

n=100; %数据初始化 z=zeros(1,n); %元胞个数

z=roadstart(z,5); %道路状态初始化,路段上随机分布5辆 cells=z;

vmax=3; %最大速度

v=speedstart(cells,vmax); %速度初始化 x=1; %记录速度和车辆位置 memor_cells=zeros(3600,n); memor_v=zeros(3600,n);

imh=imshow(cells); %初始化图像白色有车,黑色空元胞 set(imh, 'erasemode', 'none') axis equal axis tight

stop=0; %wait for a quit button push run=0; %wait for a draw

freeze=0; %wait for a freeze(冻结) while (stop==0) if(run==1)

%边界条件处理,搜素首末车,控制进出,使用开口条件 a=searchleadcar(cells); b=searchlastcar(cells);

[cells,v]=border_control(cells,a,b,v,vmax); i=searchleadcar(cells); %搜索首车位置 for j=1:i if i-j+1==n

[z,v]=leadcarupdate(z,v);

continue; else

%======================================加速、减速、随机

慢化

if cells(i-j+1)==0; %判断当前位置是否非空 continue;

else v(i-j+1)=min(v(i-j+1)+1,vmax); %加速

%=================================减速 k=searchfrontcar((i-j+1),cells); %搜素前方首个非空元胞位置 if k==0; %确定于前车之间的元胞数 d=n-(i-j+1); else d=k-(i-j+1)-1; end

v(i-j+1)=min(v(i-j+1),d);

%==============================%减速 %随机慢化

v(i-j+1)=randslow(v(i-j+1)); new_v=v(i-j+1);

%======================================加速、减速、随机慢化

%更新车辆位置

z(i-j+1)=0; z(i-j+1+new_v)=1; %更新速度 v(i-j+1)=0;

v(i-j+1+new_v)=new_v; end end end cells=z;

memor_cells(x,:) =cells; %记录速度和车辆位置 memor_v(x,:) =v; x=x+1;

set(imh,'cdata',cells) %更新图像 %update thestep number diaplay pause(0.2);

stepnumber = 1 + str2num(get(number,'string')); set(number,'string',num2str(stepnumber)) end

if (freeze==1) run = 0; freeze =0; end drawnow

end

0.9???????????????????????0.80.7????????????????????flux in vehicles/time0.60.50.40.30.20.1000.20.40.6density in vehicles/cell0.81

5???????????????????????????????????????????velocity in cell/time4321000.20.40.6density in vehicles/cell0.81

本文来源:https://www.bwwdw.com/article/1ibf.html

微信扫码分享

《交通流元胞自动机程序.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档
下载全文
范文搜索
下载文档
Top