function [road,v,vmax]=move_forward(road,v,vmax,probslow,merge)
global all_num;
[L,W]=size(road);%车道大小,包括边界
for lanes=2:3;
temp=find(road(:,lanes)>=1);
nn=length(temp);
for k=1:nn
i=temp(k);
if(lanes == 2)
front = find(road(i+1:merge,lanes)>0,1);
if(i+v(i,lanes)>=merge | (~isempty(front)&(i+v(i,lanes)>=front)))
if(i+v(i,lanes)>=merge)
if(merge-i>1)
%如果离边界大于1格
v(i+1,lanes) = 1;
road(i+1,lanes) = road(i,lanes);
road(i,lanes) = 0;
v(i,lanes) = 0;
vmax(i+1,lanes) = vmax(i,lanes);
vmax(i,lanes) = 0;
elseif(merge-i==1)
%如果离边界等于1格
v(i+1,lanes) = 0;
road(i+1,lanes) = road(i,lanes);
road(i,lanes) = 0;
v(i,lanes) = 0;
vmax(i+v(front,lanes),lanes) = vmax(i,lanes);
vmax(i,lanes) = 0;
elseif(merge==i)
v(i,lanes) = 0;
end
elseif(v(front,lanes)~=0)
%如果前面有车,且速度不为0
num = min(i+v(front,lanes),max(front-1,1));
road(num,lanes) = road(i,lanes);
road(i,lanes) = 0;
v(i,lanes) = 0;
v(num,1) = v(front,lanes);
vmax(num,lanes) = vmax(i,lanes);
vmax(i,lanes) = 0;
else
%如果前面的车速度为0,间隔大于1,则速度变为1,否则速度变为0
if(front-i>1)
v(i+1,lanes) = 1;
road(i+1,lanes) = road(i,lanes);
road(i,lanes) = 0;
v(i,lanes) = 0;
vmax(i+1,lanes) = vmax(i,lanes);
vmax(i,lanes) = 0;
elseif(front-i==1)
v(i,lanes) = 0;
end
end
elseif(road(i,lanes)==1&&rand<probslow)
a_v = v(i,lanes);
num = min(i+v(front,lanes),max(front-1,1));
v(i+a_v,lanes) = max(v(i,lanes)-1,1); %随机慢化
v(i,lanes) = 0;
road(i+a_v,lanes) = road(i,lanes);
road(i,lanes) = 0;
vmax(i+a_v,lanes) = vmax(i,lanes);
vmax(i,lanes) = 0;
elseif(isempty(front) | front-i>v(i,lanes)+1) %大于才能进行加速
a_v = v(i,lanes);
v(i+a_v,lanes) = min(v(i,lanes)+1,vmax(i,lanes)); %加速
v(i,lanes) = 0;
road(i+a_v,lanes) = road(i,lanes);
road(i,lanes) = 0;
vmax(i+a_v,lanes) = vmax(i,lanes);
vmax(i,lanes) = 0;
elseif(front-i<=v(i,lanes)) %小于安全距离进行减速,减速为前车速度
a_v = v(i,lanes);
v(i+a_v,lanes) = max(v(front,lanes),1); %减速
v(i,lanes) = 0;
road(i+a_v,lanes) = road(i,lanes);
road(i,lanes) = 0;
vmax(i+a_v,lanes) = vmax(i,lanes);
vmax(i,lanes) = 0;
end
elseif(lanes==3)
front = find(road(i+1:end,lanes)>0,1)+i;
a = find(road(:,lanes)~=0);
c = road(a,lanes);
if(isempty(front)&i+v(i,lanes)>=L)
v(i,lanes) = 0;
vmax(i,lanes) = 0;
road(i,lanes) = 0;
all_num = all_num+1;
elseif(front-i==1)
v(i,lanes) = min(v(front,lanes),vmax(i,lanes));
elseif((isempty(front) | front-1>=v(i,lanes)+i) & road(i,lanes)==1 & rand<probslow)
a_v = v(i,lanes);
if(road(i+a_v,lanes)==0)
v(i+a_v,lanes) = max(v(i,lanes)-1,1); %随机慢化
v(i,lanes) = 0;
road(i+a_v,lanes) = road(i,lanes);
road(i,lanes) = 0;
vmax(i+a_v,lanes) = vmax(i,lanes);
vmax(i,lanes) = 0;
elseif(road(i+a_v,lanes)~=0)
v(front-1,lanes) = 1; %随机慢化
v(i,lanes) = 0;
road(front-1,lanes) = road(i,lanes);
road(i,lanes) = 0;
vmax(front,lanes) = vmax(i,lanes);
vmax(i,lanes) = 0;
end
elseif(isempty(front) | front-1>=v(i,lanes)+i& front > i+1) %大于才能进行加速
a_v = v(i,lanes);
if(road(i+a_v,lanes)==0)
v(i+a_v,lanes) = min(v(i,lanes)+1,vmax(i,lanes)); %加速
v(i,lanes) = 0;
road(i+a_v,lanes) = road(i,lanes);
road(i,lanes) = 0;
vmax(i+a_v,lanes) = vmax(i,lanes);
vmax(i,lanes) = 0;
elseif(a_v~=0)
v(front-1,lanes) = min(v(i,lanes)+1,vmax(i,lanes)); %加速
v(i,lanes) = 0;
road(front,lanes) = road(i,lanes);
road(i,lanes) = 0;
vmax(front,lanes) = vmax(i,lanes);
vmax(i,lanes) = 0;
else
v(i,lanes) = 1;
end
elseif(~isempty(front) & i+v(i,lanes)> front & front > i+1)
num = min(i+v(front,lanes),max(front-1,1));
if(num~=i)
road(num,lanes) = road(i,lanes);
road(i,lanes) = 0;
v(num,1) = v(i,lanes);
v(i,lanes) = 0;
vmax(num,lanes) = vmax(i,lanes);
vmax(i,lanes) = 0;
end
end
b = find(road(:,lanes)~=0);
end
end
end
end
元胞自动机交通流模拟
4星 · 超过85%的资源 171 浏览量
2017-01-25
23:50:57
上传
评论 3
收藏 6KB ZIP 举报
YoYoDelphine
- 粉丝: 68
- 资源: 2
最新资源
- Image_1713714819368.png
- 数据可视化 matplotlib 实例.docx
- Python 使用 Matplotlib 绘制甘特图的实践.docx
- matplotlib 中的 cmap 参数介绍.docx
- 基于matlab的毕业设计基于Matlab使用LQR实现车辆轨迹跟踪源码.zip
- 基于Matplotlib 的高互动性可视化系统设计与实现
- matplotlib 数据可视化报告.docx
- 传统网页UI设计在移动应用开发中的应用研究.pdf
- 基于pytorch实现BERT+BiLSTM+CRF实现中文命名实体识别源码.zip
- 校园帮项目,毕业设计/课程设计/javaWeb/SSM
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈