• 大小: 10KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-05-23
  • 语言: Matlab
  • 标签:

资源简介

2016年全国数模竞赛B题第二问,基于matlab的元胞自动机实现

资源截图

代码片段和文件信息

1、道路运行情况模拟程序
clc;
%clear;
Tmax = 1000; %考虑的时间的上限
carnum = 0; %carnum 是当前通过的车的总数目
fieldCarNum = 0; %fieldCarNum 进入小区的车辆数
%beta = 8; %1-alpha / 10为出现车的概率,体现车流量
fieldCapure = 800; %小区内道路的承载量
fieldDistance = 80; %小区内道路的逻辑长度
fRpb = 0.8; %行人自行车修正系数
R = 0.5; %主路进入小区的比例
L1 = 0.005; %车身长度km
h = 0.0025; %标准饱和车头时距
alpha = pi / 4; %转弯角度
mu = 0.18; %横向力系数
v = 50; %车辆速度
t_avg = L1 / v ; %畅通情况下车辆直行通过计算截面的平均耗时
ER = (L1 + alpha * R)/(h * sqrt(127 * R * mu));
%右转车转换系数
fR = 100/(100 + R * (ER - 1));
%右转修正系数
theta = 0; %车辆入口延时的影响因子
delay = zeros(Tmax 1); %记录入口延时
T = 20; %路灯周期
Tg = 5; %绿灯时间
Car = cell(carnum1); %Car 是所有的车的集合
Car0 = cell(carnum1); %Car 是所有的车的集合
car = struct(‘road‘0‘distance‘0‘state‘0); %road 是当前车所在的道路,
distance 表示在这条路上的位置state 表示是否在区域里,1 在里面,0 在外面
t = 0; %当前时间
Dt = cell(t1); %每个时刻的平均延误
Dt0 = cell(t1); %每个时刻的平均延误
Light = 0; % Light 表示当前灯是红灯 0,还是绿灯 1
roadnum = 4; %roadnum 是所有的道路数目
Outroad = []; % 与出口相连的路
Outroad(1) = 4;
Inroad = [23]; %与入口相连的路
FieldRoad = []; %小区内的路
FieldRoad(1) = 3;
21
Troad = zeros(roadnum1);%每条路上的路灯周期
Tgroad = zeros(roadnum1);%每条路上绿灯时间
RoadMap = zeros(roadnumroadnum); %路的可达性矩阵
RoadMap0 = zeros(roadnumroadnum); %路的可达性矩阵
Roadcapture = zeros(roadnum1); %Roadcapture 路的设计承载量
Roadcarnum = zeros(roadnum1); %Roadcarnum 路当前有的车数量
Roadcarnum0 = zeros(roadnum1); %Roadcarnum 路当前有的车数量
Roaddistance = zeros(roadnum1);%Roaddistance 路的距离
Roaddt = zeros(roadnum1); %Roaddt 每条路上的平均延迟时间
Roadcapture = [1000100010001];
Roadcapture(3) = fieldCapure;
Roadcapture = Roadcapture‘;
Roaddistance = [1001001001];
Roaddistance(3) = fieldDistance;
Troad(:) = 20;
Tgroad(:) = 5;
RoadMap = [0000;1000;1000;0110];
RoadMap0 = [0000;1000;0000;0100];
myres = zeros(5004);
Flag = [0100]‘;
mainflow = 3600 * (1 - beta / 10); %主路的车流量
for t = 1:Tmax
%%%%%%判断当前是否有车到来 0 没有,1 有
Dt{t} = 0;
Dt0{t} = 0;
ra = rand();
if ra >= beta / 10
ra = 1;
else
ra = 0;
end
%%%%%%增加车的数量更新车的情况
if ra == 1
carnum = carnum+1;
car.road = 1;
car.distance = Roaddistance(1);
22
car.state = 1;
Car{carnum} = car;
Car0{carnum} = car;
Roadcarnum(1) = Roadcarnum(1)+1;
Roadcarnum0(1) = Roadcarnum0(1)+1;
end
%%%%%%判断当前红绿灯情况
Light = mod(tT);
if Light <= Tg
Light = 1;
else
Light = 0;
end
for cari = 1:carnum
if(Car{cari}.state == 0)
continue;
end
%%不考虑小区开放时
if Light == 1 %%%绿灯时
[nextroadnextdistancenextstate] =
nextdir(cariRoadMap0Car0RoaddistanceOutroadRoadcarnum0); %%%函数
nextdir 返回 cari 这辆车下一次所在的路的在路上的距离
else %%%%红灯时
[nextroadnextdistancenextstate] =
nextdir_red(cariRoadMap0Car0RoaddistanceOutroadRoadcarnum0);
end
Roadcarnum0(Car0{cari}.road) = Roadcarnum0(Car0{cari}.road)-1;
Car0{cari}.road = nextroad;
Car0{cari}.distance = nextdistance;
Car0{cari}.state = nextstate;
if nextstate == 1
Roadcarnum0(nextroad) = Roadcarnum0(nextroad)+1; %%%%%%当前
这条路上的车的数量
end
%%考虑小区开放时
% disp(strcat(‘car‘ num2str(cari)));
if Light == 1 %%%绿灯时
[nextroad

评论

共有 条评论