Matlab多车道交通流元胞自动机模型 智能换道和信号优化

% 多车道交通流元胞自动机模型 智能换道和信号优化
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值