您现在的位置:首页 >> 技术文章 >> MATLAB技术 >> 内容

基于matlab交通道路交通流的仿真

时间:2018-3-1 23:39:50 点击:

  核心提示:基于matlab交通道路交通流的仿真 ...
clear all 
clc 
%========================================================================== 
%                            可修改参数 
%========================================================================== 
% 确定车位的数量 
car_number = 60; 
% 初始车生成概率 
r = 0.5; 
% 循环次数 circle 
circle = 80000; 
% 最大速度 Vmax 
Vmax = 5; 
% 减速的概率 p  
p = 0.2; 
% 观察点位置 
obs_pos = 50; 
% 把 cluster 秒钟平均考虑 
cluster = 100; 
% 最后一步减速的概率 
p_last = 0.5; 
 
%========================================================================== 
%========================================================================== 
 
% 确定画面1的大小 
subplot(2,1,1) 
% 确定坐标大小 
axis([-1 car_number+1 -6 6]) 
axis off 
grid off 
% 标签 
text(car_number/2,2.5,xlate('Cell Automata'), 'HorizontalAlignment',... 
'center'); 
axis on; 
% 绘制道路和网格 
road = patch([0 0 car_number car_number], [-.35 .35 .35 -.35], 'g'); 
for i=1:car_number 
    line([i i],[-0.35 0.35],'Color','b'); 
end 
% 判断向量 
% dec = zeros(1, car_number); % 用于判断路上是否有车 
 
%========================================================================== 
%                              生成初始车辆分布 
%========================================================================== 
% % 初始车生成概率 r 
% % 车位向量 
all_car=zeros(1,car_number); 
% 生成车的初始分布 
for i=1:car_number 
    if rand(1)<r 
        all_car(i) = line(i-0.5,0,'color','k','marker','s','markersize',... 
        5,'MarkerFaceColor','y', 'erasemode','xor'); 
    else 
        all_car(i) = line(i-0.5,0,'color','k','marker','s','markersize',... 
        0.001,'MarkerFaceColor','y', 'erasemode','xor'); 
    end     
end 
dec = zeros(1, car_number); 
%========================================================================== 
%                                 变量设置 
%========================================================================== 
% 循环次数 circle 
% 最大速度 Vmax 
% 减速的概率 p  
 
% 瞬时速度向量 
v = ones(1,car_number+1); % 包括进来车的速度 
% 安全速度向量 
v_safe = zeros(1,car_number+1); % 包括进来车的速度 
% 经过观察点 car_position 的车的数量 car_pass 分布 每秒观察一次 
car_pass = zeros(1,circle); 
% 对应时刻的整体密度 
density = zeros(1,circle); 
% 车辆到达分布向量  
% 临时变量 temp 
a = zeros(1,circle); 
temp = ones(1,circle/cluster); 
% temp = rand(1,circle/cluster); 
for i = 1:circle/cluster 
        temp(i) = i/(circle/cluster); 
end 
 
for i=1:circle/cluster 
    a(1+cluster*(i-1):cluster*i) = temp(i); 
end 
% ========================================================================= 
%                                运行过程 
% ========================================================================= 
% 车辆到达分布向量 a  
for i = 1:circle 
    % gap的计算 
    gap = gap_generate(dec); 
     
    % 安全速度的计算 
    for k = 1:car_number+1 
        v_safe(k) = min([v(k)+1, gap(k), Vmax]); 
    end 
 
    % 瞬时速度的计算 
    v(1) = v_safe(1);  % 对将进入的车我们假设它不减速,即到达后如果前面有空位, 
                       % 则一定进入系统 
    for j=2:car_number 
        if(rand(1)<p) 
            v(j) = max([v_safe(j)-1, 0]); 
        else 
            v(j) = v_safe(j); 
        end 
    end 
    % @@@@@@@@@@@特别限制最后一格的速度@@@@@@@@@@@@@@@@@ 
    if rand(1)<p_last 
        v(car_number+1)=0; 
    else 
        v(car_number+1)=1; 
    end 
     
     
    % 查找所有有车的车位及此时路上的总车辆 
    if max(dec)==0 
        car_exist = 0; 
        car_sum = 0; 
    else 
        car_exist = find(dec);   % 所有有车车位的序号 
        car_sum = length(car_exist); % 所有车的位置 
    end 
 
    % 瞬时密度 
    density(i) = sum(dec(obs_pos-3:obs_pos+3))/7; 
     
    % local data 
    c = zeros(1,car_number+2); 
     
  
    % 判断下一次车位的情况 
   if car_sum == 0       % 没有车在路上   
       if (rand(1)<a(i) && v(1)~=0) 
            c(v(1)) = 1;  
            if v(1)>obs_pos  % 刚进来的那辆车经过 观察点 
                car_pass(i) = 1; 
            end 
        end 
    else  % 至少有一辆车在路上 
        if (rand(1)<a(i) && v(1)~=0)  % 到达一辆车且其前面还有空间 
            c(v(1)) = 1;  
            if v(1)>obs_pos 
                car_pass(i) = 1;                 
            end 
        end 
        for m=1:car_sum 
            % 移动车: car_exist(m)为第m辆车处的位置, 
            % v(car_exist(m)+1)为它能移动的距离 
            c(car_exist(m)+v(car_exist(m)+1)) = 1;   
            if (car_exist(m)<=obs_pos && ... 
                car_exist(m)+v(car_exist(m)+1)>obs_pos) 
               car_pass(i) = 1;  
            end 
        end 
    end 
 
    % 把 c 的前car_number个值重新赋给 dec 
    dec = c(1:car_number); 
%============================================ 
%                重绘画面 
%============================================ 
   for pp = 1:car_number 
       if dec(pp) == 1 
           set(all_car(pp), 'MarkerSize',5); 
       else 
           set(all_car(pp), 'MarkerSize',0.001); 
       end 
   end 
   drawnow; pause(0.1); 
 end 
 
%========================================================================== 
%                          绘制第二张统计图 
%========================================================================== 
subplot(2,1,2) 
 
axis([0 1 0 1]) 
axis on; 
 
average_pass = zeros(1, circle/cluster); 
average_density = zeros(1, circle/cluster); 
for i = 1:circle/cluster 
    average_pass(i) = sum(car_pass((1+(i-1)*cluster):(i*cluster)))/cluster; 
    average_density(i) ... 
    = sum(density((1+(i-1)*cluster):(i*cluster)))/cluster;     
end 
plot(average_density,average_pass,'.'); 
 
xlabel('density k (vehicles/cell)') 
ylabel('flow q (vehicles/second)') 
title('k-q plot')

作者:基于matlab交通道路交通流的仿真 来源:基于matlab交通道路交通流的仿真
  • 您是如何找到本站的?
  • 百度搜索
  • Google搜索
  • 查阅资料过程中
  • 论坛发现
  • 百度贴吧发现
  • 朋友介绍
本站最新成功开发工程项目案例
相关文章
  • 没有相关文章
相关评论
发表我的评论
  • 大名:
  • 内容:
  • matlab代做|matlab专业代做|matlab淘宝代做(www.hslogic.com) © 2018 版权所有 All Rights Reserved.
  • Email:highspeed_logic@163.com 站长QQ: 1224848052

    专业代做/代写/承接、MATLAB、SIMULINK、FPGA项目、博士/硕士/本科毕业设计、课题设计、论文,毕业论文,Coursework、Eassy、Assignment