clc; clear all; close all;

% 模型参数 N = 50; % 每条车道的元胞数 L = 500; % 道路长度 T = 1000; % 模拟时间 dt = 1; % 时间步长 v_max_s = 20; % 小车最大速度 v_max_b = 30; % 大车最大速度 s0_s = 3; % 小车安全距离 s0_b = 5; % 大车安全距离 p_s = 0.3; % 小车换道概率 p_b = 0.1; % 大车换道概率 p_small = 0.8; % 小车比例

% 初始化道路 road = zeros(2, N, L/N); % 两条车道

% 模拟 for t = 1:T % 每个时间步更新每个元胞的状态 for k = 1:L/N-1 % 去掉最后一列,最后一列无法更新元胞状态 for i = 1:2 for j = 1:N if road(i, j, k) > 0 % 该元胞有车辆 v = road(i, j, k+1); % 距离前车的距离 a = 0; if v ~= 0 % 前面有车 d = v - road(i, j, k) - road(i, j, k+1); % 相对距离 if d <= s0_s && road(i, j, k) < v_max_s % 安全距离内且小车 a = -0.5*(v - road(i, j, k))^2 / d; % 减速 elseif d <= s0_b && road(i, j, k) < v_max_b % 安全距离内且大车 a = -0.5*(v - road(i, j, k))^2 / d; % 减速 end end if a == 0 && road(i, j, k) < v_max_s && rand() < p_small % 保持速度或加速,小车有一定概率加速 a = 0.5*(1 - (road(i, j, k)/v_max_s)^2); elseif a == 0 && road(i, j, k) < v_max_b % 保持速度或加速,大车不能加速 a = 0.5*(1 - (road(i, j, k)/v_max_b)^2); end % 更新速度和位置 if a < 0 && -a > road(i, j, k) % 碰撞 road(i, j, k) = 0; else if i==1 && j==1 && rand()<p_small*(1-p_b) && t>100 % 小车向右换道 road(2, j-1, k) = road(1, j, k); road(1, j, k) = 0; elseif i==2 && j==1 && rand()<p_b*(1-p_small) && t>100 % 大车向左换道 road(1, j+1, k) = road(2, j, k); road(2, j, k) = 0; elseif i==1 && j==1 && rand()<p_smallp_b && t>100 % 小车向左换道 road(1, j+1, k) = road(1, j, k); road(1, j, k) = 0; elseif i==2 && j==1 && rand()<p_bp_small && t>100 % 大车向右换道 road(2, j-1, k) = road(2, j, k); road(2, j, k) = 0; elseif i==1 && j>1 && road(2, j-1, k) == 0 && rand()<p_s % 小车向右换道 road(2, j-1, k) = road(1, j, k); road(1, j, k) = 0; elseif i==2 && j<N && road(1, j+1, k) == 0 && rand()<p_s % 大车向左换道 road(1, j+1, k) = road(2, j, k); road(2, j, k) = 0; else % 不换道 road(i, j, k) = min(max(road(i, j, k) + road(i, j, k)adt, 0), v_max_b); end end end end end end % 在图形上显示道路状态 image(road(:, :, 1)*50); colormap(gray); axis off; pause(0.01); flow_s = 0; flow_b = 0; density_s = 0; density_b = 0; for k = 1:L/N for i = 1:2 for j = 1:N if road(i, j, k) > 0 if road(i, j, k) <= v_max_s % 小车 flow_s = flow_s + 1; density_s = density_s + 1/road(i, j, k); else % 大车 flow_b = flow_b + 1; density_b = density_b + 1/road(i, j, k); end end end end end Flow_s(t) = flow_s * 3600 / (T * N * 2 * p_small); % 每小时每条车道小车流量 Flow_b(t) = flow_b * 3600 / (T * N * 2 * (1-p_small)); % 每小时每条车道大车流量 Density_s(t) = density_s / (L/N * N * 2 * p_small); % 每米每条车道小车流密度 Density_b(t) = density_b / (L/N * N * 2 * (1-p_small)); % 每米每条车道大车流密度 v_ave_s = zeros(1, ceil(L/N)); v_ave_b = zeros(1, ceil(L/N)); density_s = zeros(1, ceil(L/N)); density_b = zeros(1, ceil(L/N)); for k = 1:L/N v_sum_s = 0; v_sum_b = 0; n_s = 0; n_b = 0; for i = 1:2 for j = 1:N if road(i, j, k) > 0 if road(i, j, k) <= v_max_s % 小车 v_sum_s = v_sum_s + road(i, j, k); n_s = n_s + 1; else % 大车 v_sum_b = v_sum_b + road(i, j, k); n_b = n_b + 1; end end end end if n_s > 0 v_ave_s(k) = v_sum_s / n_s; density_s(k) = n_s / (L/N * 2 * p_small); end if n_b > 0 v_ave_b(k) = v_sum_b / n_b; density_b(k) = n_b / (L/N * 2 * (1-p_small)); end end l_s=0; l_b=0; for p=1:length(v_ave_s) if v_ave_s(p)~=0 l_s=l_s+1; end end for p=1:length(v_ave_b) if v_ave_b(p)~=0 l_b=l_b+1; end end V_s(t)=sum(v_ave_s)/l_s; V_b(t)=sum(v_ave_b)/l_b;

end figure; subplot(2, 1, 1); plot(Density_s, Flow_s, '-o'); xlabel('小车流密度'); ylabel('小车流量'); hold on; plot(Density_b, Flow_b, '-o'); xlabel('车流密度'); ylabel('车流量'); legend('小车', '大车'); subplot(2, 1, 2); plot(Density_s, V_s, '-o'); xlabel('小车流密度'); ylabel('平均速度'); hold on; plot(Density_b, V_b, '-o'); xlabel('车流密度'); ylabel('平均速度'); legend('小车', '大车');

基于元胞自动机的双车道交通流模拟

原文地址: https://www.cveoy.top/t/topic/nRY9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录