% 多车道交通流元胞自动机模型 智能换道和信号优化
clc; clear; close all;
%% 基本参数设置
simulation_time = 100; % 总模拟时间步长
road_length = 1000; % 道路长度(单元格)
num_lanes = 3; % 车道数
density = 0.12; % 初始车辆密度
max_speed = 5; % 车辆最大速度(单元格/时间步)
probability_slow = 0.3; % 随机慢化概率
% 换道相关参数
safe_distance = 4; % 安全换道距离
impatience_factor = 0.05; % 驾驶员急躁系数
% 交通信号参数
signal_cycle = 60; % 信号周期
green_time = 35; % 绿灯时间
signal_position = 500; % 信号灯位置
%% 系统初始化
% 元胞自动机表示(3D矩阵:[车道,位置, 属性])
% 属性存储内容:[速度,加速度,换道倾向,驾驶员类型]
road = zeros(num_lanes, road_length, 4);
vehicle_colors = zeros(num_lanes, road_length, 3); % 存储车辆颜色
% 随机生成初始车辆位置
for lane = 1:num_lanes
positions = randperm(road_length, floor(road_length*density));
road(lane, positions, 1) = randi([1 max_speed], size(positions)); % 初始速度
road(lane, positions, 4) = randi([1 3], size(positions)); % 驾驶员类型 (1-保守,2-普通,3-激进)
end
% 初始化颜色矩阵(根据驾驶员类型)
color_map = [0 0.5 1; 1 0.8 0; 1 0.2 0]; % RGB颜色映射
for lane = 1:num_lanes
drivers = road(lane, :, 4);
vehicle_colors(lane, drivers>0, :) = color_map(drivers(drivers>0), :);
end
%% 主要模拟循环
figure('Position', [200 100 1200 700], 'Color', 'w')
h = imagesc(1:road_length, 1:num_lanes, ones(num_lanes, road_length));
colormap(gray)
hold on
axis image
title(sprintf('时间步: 0 / 车辆数: %d', sum(road(:,:,1)>0, 'all')))
for t = 1:simulation_time
delete(findobj(gca, 'Type', 'rectangle')) % 清除上一帧绘图
% 交通信号控制 (每隔signal_cycle步黄灯3步)
signal_state = mod(t, signal_cycle);
if signal_state <= green_time
signal_color = 'g';
elseif signal_state <= green_time+3
signal_color = 'y';
else
signal_color = 'r';
end
% 并行更新所有车辆状态
new_road = zeros(size(road));
for lane = 1:num_lanes
for pos = 1:road_length
if road(lane, pos, 1) == 0 % 当前位置无车辆
continue
end
current_speed = road(lane, pos, 1);
driver_type = road(lane, pos, 4);
% 加速度阶段 (根据驾驶员类型调整)
switch driver_type
case 1 % 保守型
acceleration = 1;
case 2 % 普通型
acceleration = 2;
case 3 % 激进型
acceleration = 3;
end
% 安全速度调整
gap = find_gap(road(lane, :, 1), pos, current_speed);
new_speed = min([current_speed + acceleration, max_speed, gap-1]);
% 随机慢化(概率与驾驶员类型相关)
if rand() < probability_slow*(4-driver_type)/3
new_speed = max(new_speed - 2, 0);
end
% 换道决策(基于左右车道评估)
[change_left, change_right] = evaluate_lane_change(road, lane, pos, safe_distance, impatience_factor);
% 执行换道(优先左车道超车)
new_lane = lane;
if change_left && lane > 1
new_lane = lane - 1;
elseif change_right && lane < num_lanes
new_lane = lane + 1;
end
% 障碍检测(处理交通事故)
if check_accident(road, new_lane, pos, new_speed)
new_speed = 0;
road(lane, pos, 3) = road(lane, pos, 3) + 0.1; % 增加换道倾向
end
% 交通信号约束
if (signal_state > green_time+3) && (abs(pos - signal_position) < 5)
new_speed = min(new_speed, 0);
end
% 更新车辆位置
new_pos = mod(pos + new_speed - 1, road_length) + 1;
new_road(new_lane, new_pos, 1) = new_speed;
new_road(new_lane, new_pos, 2) = acceleration;
new_road(new_lane, new_pos, 3) = road(lane, pos, 3)*0.9; % 换道倾向衰减
new_road(new_lane, new_pos, 4) = driver_type;
% 绘制车辆
rectangle('Position', [new_pos-0.5, new_lane-0.4, 1, 0.8],...
'FaceColor', vehicle_colors(lane, pos, :),...
'EdgeColor','none')
end
end
% 绘制交通信号
rectangle('Position', [signal_position-1.5, num_lanes+0.2, 3, 0.6],...
'FaceColor', signal_color, 'EdgeColor','k')
% 更新路况矩阵
road = new_road;
title(sprintf('时间步: %d / 当前车辆数: %d / 平均速度: %.1f',...
t, sum(road(:,:,1)>0, 'all'), mean(road(road(:,:,1)>0))))
drawnow
% 收集交通流数据
flow_data(t) = sum(road(:,:,1)>0, 'all');
speed_data(t) = mean(road(road(:,:,1)>0));
end
%% 后期数据分析(可视化)
figure;
subplot(1,2,1)
plot(1:simulation_time, flow_data)
xlabel('时间步'), ylabel('道路车辆数')
title('交通流密度演化'), grid on
subplot(1,2,2)
scatter(flow_data/road_length/num_lanes, speed_data, 20, 1:simulation_time, 'filled')
xlabel('交通密度'), ylabel('平均速度')
title('交通流基本图'), colorbar
grid on
%% 辅助函数
function gap = find_gap(lane, pos, speed)
% 寻找当前车道前方连续空单元格数
road_length = length(lane);
gap = 0;
for d = 1:min(speed+1, road_length)
check_pos = mod(pos + d - 1, road_length) + 1;
if lane(check_pos) > 0
break
end
gap = gap + 1;
end
end
function [left_ok, right_ok] = evaluate_lane_change(road, lane, pos, safe_dist, impatience)
% 评估左右车道换道安全性
left_ok = false;
right_ok = false;
current_speed = road(lane, pos, 1);
% 左车道检查
if lane > 1
left_gap = find_gap(road(lane-1, :, 1), pos, current_speed);
back_gap = check_backward_gap(road(lane-1, :, 1), pos);
if min(left_gap, back_gap) > safe_dist*(1 + impatience*road(lane,pos,3))
left_ok = true;
end
end
% 右车道检查
if lane < size(road,1)
right_gap = find_gap(road(lane+1, :, 1), pos, current_speed);
back_gap = check_backward_gap(road(lane+1, :, 1), pos);
if min(right_gap, back_gap) > safe_dist*(1 + impatience*road(lane,pos,3))
right_ok = true;
end
end
end
function back_gap = check_backward_gap(lane, pos)
% 检查后方车辆的安全距离
road_length = length(lane);
back_gap = 0;
for d = 1:road_length
check_pos = mod(pos - d - 1, road_length) + 1;
if lane(check_pos) > 0
break
end
back_gap = back_gap + 1;
end
end
function accident = check_accident(road, lane, pos, speed)
% 交通事故检测(两车碰撞时返回true)
accident = false;
if lane < 1 || lane > size(road,1) || speed == 0
return
end
check_pos = mod(pos + speed - 1, size(road,2)) + 1;
if sum(road(:, check_pos, 1) > 0) > 1
accident = true;
road(:, check_pos, 1) = 0; % 消除碰撞车辆
end
end
Matlab多车道交通流元胞自动机模型 智能换道和信号优化
最新推荐文章于 2025-06-14 12:47:20 发布