clc; clear all; close all;

% 模型参数 N = 50; % 每条车道的元胞数 L = 500; % 道路长度 T = 2000; % 模拟时间 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; % 小车比例 lambda = 0.5; % 泊松分布的参数

% 初始化道路 road = zeros(2, N2, L/N); % 两条车道 num=0; % 模拟 for t = 1:T % 生成新车 if rand() < lambda % 左侧有新车 if rand() < p_small % 新车是小车 road(1, 1:2, 1) = randi(v_max_s); % 随机生成速度 else % 新车是大车 road(1, 1:2, 1) = randi(v_max_b); % 随机生成速度 end end % 每个时间步更新每个元胞的状态 for k = 1:L/N-1 % 去掉最后一列,最后一列无法更新元胞状态 for i = 1:2 for j = 1:N if road(i, j, k) > 0 % 该元胞有车辆 if j <= N % 小车 v = road(i, j, k+1); % 距离前车的距离 a = 0; if v ~= 0 % 前面有车 d = v - (road(i, j, k)+road(i, j+1, 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_s % 保持速度或加速,小车有一定概率加速 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 else % 大车 v = road(i, j, k+1); % 距离前车的距离 a = 0; if v ~= 0 % 前面有车 d = v - (road(i, j, k)+road(i, j-1, 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_b % 保持速度或加速,大车不能加速 a = 0.5*(1 - (road(i, j, k)/v_max_b)^2); end end % 更新速度和位置 if a < 0 && -a > road(i, j, k) % 碰撞 road(i, j, k) = 0; else % 确定每个车辆的最大速度 if i == 1 % 小车的最大速度为 v_max v_max_i = v_max_s; else % 大车的最大速度为 v_max/2 v_max_i = v_max_b; end

% 更新速度
v_new = min(road(i, j, k) + a*dt, v_max_i);

% 计算最大可移动的距离
if i == 1 % 小车的移动距离为 1 或 2 或 3
    d_max = min(v_new, sum(road(1, j+1:N, k)==0));
else % 大车的移动距离为 1 或 2
    if j+2 <= N % 大车前方有两个空位
        d_max = min(v_new, sum(road(1, j+1:j+2, k)==0));
    elseif j+1 <= N % 大车前方有一个空位
        d_max = min(v_new, 1);
    else % 大车到达车道尽头
        d_max = 0;
    end
end

% 计算新位置
s_new = j + floor(v_new*dt + 0.5*a*dt^2);

% 判断是否需要换道 if i==1 && j>2 && road(2, j-2, k) == 0 && rand()<p_s % 小车向右换道 road(2, j-2, k) = v_new; road(1

clc; clear all; close all; 模型参数N = 50; 每条车道的元胞数L = 500; 道路长度T = 2000; 模拟时间dt = 1; 时间步长v_max_s = 20; 小车最大速度v_max_b = 30; 大车最大速度s0_s = 3; 小车安全距离s0_b = 5; 大车安全距离p_s = 03; 小车换道概率p_b = 01; 大车换道概率

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

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