目录
元胞自动机在被引入交通领域后,得到了迅猛的发展。1992年,Nagel和Schreckenberg提出了著名的NaSch(两人名字的合写)模型,作为对Wolfram的184号模型的推广。
纳什(NaSch)模型,也被称为NaSch交通流模型,是由德国物理学家 Dietrich E. Wolf 和 Bernd A. Schadschneider 于1992年提出的,是对伯纳德·赫兹伯格(Bernard H. Greenberg)提出的元胞自动机模型的进一步发展,主要用于模拟单向道路的交通流动现象。此模型通过简单的规则捕捉了真实交通中的基本特征,如拥堵形成、消散及交通流的不稳定性等。在优化交通管理策略、寻找最佳干预参数方面,结合诸如遗传算法、粒子群优化、模拟退火等优化算法,可以有效探索模型参数空间,以实现交通效率的最大化。
1.NaSch模型基础
NaSch模型假设道路上的车辆在离散的时间步t和空间步x上移动。每个空间单元(车道上的一个位置)可以为空或被一辆车占据。每辆车有三个状态参数:位置xi(t),速度vi(t)(取值为0, 1, ..., vmax),以及一个安全距离di,其中i表示车辆的索引。模型的基本规则包括:
3.随机减速: 即使前方有足够的空间,车辆也可能因为驾驶者行为的不确定性而减速,
在这个模型中,时间、空间和速度被整数离散化,道路被划分为离散的元胞。每个元胞或者是空的,或者被一辆车占据。每辆车的速度可以取 0,1,2,...,在 t→t+1 的过程中,模型按如下规则并行演化:
NaSch模型和之后的一系列元胞自动机模型都采用并行更新的方法,可以引起一连串过度反应,使得模拟更加真实。要完成模型的数值模拟还需确定边界条件。在这些模型中通常使用的边界条件有两种:周期性边界条件和开口边界条件。周期性边界:每次更新结束之后,检测头车的位置,如果头车位置超过道路范围,则这辆车将从道路开始位置重新进入系统,并变为道路上的尾车。
2.优化算法应用
为了找到模型的最佳干预参数(例如最大速度vmax,安全距离分布参数,随机减速概率p等),可以使用优化算法。以遗传算法为例,其流程大致如下:
-
初始化:随机生成一组解(个体),每个解代表一组参数配置。
-
评估:将每组参数代入NaSch模型中,通过仿真计算得到的交通流效率(如平均速度、流量、拥堵长度等)作为适应度函数值。
-
选择:基于适应度值,从当前种群中选择较优的个体进入下一代。
-
交叉与变异:通过交叉操作交换个体的部分基因(参数),变异操作则随机改变某些个体的参数值,增加多样性。
-
重复步骤2-4,直到满足停止条件(如达到预定迭代次数或收敛到足够好的解)。
3.MATLAB程序
........................................................................
run = 1;
%% 元胞自动机建立
t = 1; % 当前时间
while quit == 0 && t <= Ttotal
nAccident = 0; % 事故数
if run == 1
%% 新车辆进入观测区域
if t > Twindow
nOut = sum(sum(1-roadHist(t-Twindow:t-1,:,nLength))); % 驶出车辆数
rOut = nOut/(Twindow*nRoad); % 驶出车辆率
nIn = nOut; % 驶入车辆数
rIn = rOut; % 驶入车辆率
for k = 1:nRoad
[front,vf] = FindFront(road(k,:),v(k,:),nLength,1); % 获取前一辆车的位置和速度
if front == 1
continue;
else
rIn = 1;
if rand() < rIn
road(k,1) = 0; % 生成新进入车辆
v(k,1) = v(k,front); % 新进入车辆速度默认与前车一致
end
end
end
end
%% 速度与位置变化
for i = 1:nRoad
for j = 1:nLength
if road(i,j) ~= 0 % 此处无车
continue;
end
if v(i,j) < 0 % 处于事故处理中
v(i,j) = v(i,j)+1;
continue;
end
iChange = ChangeRoad(i,nRoad,sigma); % 车辆变道
if rand(1) > ratioManual % 自动驾驶速度变化
v(i,j) = SpeedUp(v(i,j),aMax_up_auto,vMax,ksai_auto); % 加速过程
v(iChange,j) = v(i,j);
if iChange ~= i
v(i,j) = 0;
end
[front,vf] = FindFront(road(iChange,:),v(iChange,:),nLength,j); % 获取前一辆车的位置和速度
d = front-j; % 车头间距
D = vMax/aMax_down_auto*(v(iChange,j)-vf); % 车头间距裕量
v(iChange,j) = SpeedDown(v(iChange,j),dMax_auto,aMax_down_auto,d,D,ksai_auto); % 减速过程
else % 手动驾驶速度变化
v(i,j) = SpeedUp(v(i,j),aMax_up_manual,vMax,ksai_manual); % 加速过程
v(i,j) = SpeedDelayBrake(v(i,j),aMax_down_manual,delta_manual); % 随机慢化延迟刹车过程
v(iChange,j) = v(i,j);
if iChange ~= i
v(i,j) = 0;
end
[front,vf] = FindFront(road(iChange,:),v(iChange,:),nLength,j); % 获取前一辆车的位置和速度
d = front-j; % 车头间距
D = vMax/aMax_down_manual*(v(iChange,j)-vf+Tr*(aMax_up_manual+aMax_down_manual)); % 车头间距裕量
v(iChange,j) = SpeedDown(v(iChange,j),dMax_manual,aMax_down_manual,d,D,ksai_manual); % 减速过程
end
end
end
% 位置变化
roadTmp = ones(nRoad,nLength); % 下一时刻道路矩阵
for i = 1:nRoad
for j = 1:nLength
if road(i,j) ~= 0
continue;
end
if j+round(v(i,j)) <= nLength
if roadTmp(i,j+round(v(i,j))) == 0 % 此处已有车,因此发生追尾
nAccident = nAccident+1;
end
roadTmp(i,j+round(v(i,j))) = 0;
end
end
end
vHist(t,:,:) = v; % 速度历史记录存储
roadHist(t,:,:) = roadTmp; % 位置历史记录存储
nAccidentHist(1,t) = nAccident; % 事故数历史记录存储
road = roadTmp; % 当前位置数据更新
t = t+1;
set(imgh,'cdata',road); % 更新图像
pause(0.001);
timeNew = 1+str2double(get(time,'string'));
set(time,'string',num2str(timeNew)); % 更新时间计数变量
end
if stop == 1
run = 0;
stop = 0;
end
drawnow;
end
%% 事故频度图
figure(2)
hold on
lam = poissfit(nAccidentHist)
[counts,centers] = hist(nAccidentHist,max(nAccidentHist));
spn = 1:10;
bar(centers(spn), counts((spn)) / sum(counts((spn))),'b');
plot(spn-.5,lam .^spn ./factorial(spn).*exp(-lam),'r','linewidth',1.5);
legend('频率分布直方图','泊松分布拟合曲线')
xlabel('事故数');
ylabel('频率');
sum(nAccidentHist(end-50:end))
up4046
4.仿真结果
NaSch模型被广泛应用于交通系统的研究和交通管理策略的制定,因为它能够捕捉到实际交通流中的许多复杂现象,如交通堵塞、车流波动等。尽管模型相对简单,但通过调整参数和规则,可以对各种交通状况进行有效模拟。