• 【元胞自动机】元胞自动机求解城市小区开放对周边道路通行影响研究【含Matlab源码 233期】


    ⛄一、元胞自动机简介

    1 元胞自动机发展历程
    最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视.
    1970 年, 剑桥大学的约翰 · 何顿 · 康威设计了一个电脑游戏 “生命游戏” 后, 元胞自动机才吸引了科学家们的注意.

    1983 年 S.Wolfram 发表了一系列论文. 对初等元胞机 256 种 规则所产生的模型进行了深入研究, 并用熵来描述其演化行 为, 将细胞自动机分为平稳型, 周期型, 混沌型和复杂型.

    2 对元胞自动机的初步认识
    元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法。典型的元胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状态。变化规则适用于每一个元胞并且同时进行。典型的变化规则,决定于元胞的状态,以及其( 4 或 8 )邻居的状态。

    3 元胞的变化规则&元胞状态
    典型的变化规则,决定于元胞的状态,以及其( 4 或 8 )邻居的状态。

    4 元胞自动机的应用
    元胞自动机已被应用于物理模拟,生物模拟等领域。

    5 元胞自动机的matlab编程
    结合以上,我们可以理解元胞自动机仿真需要理解三点。一是元胞,在matlab中可以理解为矩阵中的一点或多点组成的方形块,一般我们用矩阵中的一点代表一个元胞。二是变化规则,元胞的变化规则决定元胞下一刻的状态。三是元胞的状态,元胞的状态是自定义的,通常是对立的状态,比如生物的存活状态或死亡状态,红灯或绿灯,该点有障碍物或者没有障碍物等等。

    6 一维元胞自动机——交通规则
    定义:
    6.1 元胞分布于一维线性网格上.
    6.2 元胞仅具有车和空两种状态.
    在这里插入图片描述
    7 二维元胞自动机——生命游戏
    定义:
    7.1 元胞分布于二维方型网格上.
    7.2 元胞仅具有生和死两种状态.
    在这里插入图片描述
    元胞状态由周围八邻居决定.
    规则:
    在这里插入图片描述
    骷髅:死亡;笑脸:生存
    周围有三个笑脸,则中间变为笑脸
    少于两个笑脸或者多于三个,中间则变死亡。

    8 什么是元胞自动机
    离散的系统: 元胞是定义在有限的时间和空间上的, 并且元 胞的状态是有限.
    动力学系统: 元胞自动机的举止行为具有动力学特征.
    简单与复杂: 元胞自动机用简单规则控制相互作用的元胞 模拟复杂世界.

    在这里插入图片描述
    9 构成要素
    在这里插入图片描述
    (1)元胞 (Cell)
    在这里插入图片描述
    元胞是元胞自动机基本单元:
    状态: 每一个元胞都有记忆贮存状态的功能.
    离散: 简单情况下, 元胞只有两种可能状态; 较复杂情况下, 元胞具有多种状态.
    更新: 元胞的状态都安照动力规则不断更新.
    (2)网格 (Lattice)
    不同维网格
    在这里插入图片描述
    常用二维网格
    在这里插入图片描述
    (3)邻居 (Neighborhood)
    在这里插入图片描述
    (4)边界 (Boundary)
    在这里插入图片描述
    反射型:以自己作为边界的状态
    吸收型:不管边界(车开到边界就消失)

    (5)规则(状态转移函数)
    定义:根据元胞当前状态及其邻居状况确定下一时刻该元胞状态的动力学函数, 简单讲, 就是一个状态转移函数.
    分类 :
    总和型: 某元胞下时刻的状态取决于且仅取决于它所有邻居 的当前状态以及自身的当前状态.
    合法型: 总和型规则属于合法型规则. 但如果把元胞自动机 的规则限制为总和型, 会使元胞自动机具有局限性.
    (6)森林火灾
    在这里插入图片描述
    绿色:树木;红色:火;黑色:空地。
    三种状态循环转化:
    树:周围有火或者被闪电击中就变成火。
    空地:以概率p变为树木
    理性分析:红为火;灰为空地;绿是树
    在这里插入图片描述
    元胞三种状态的密度和为1
    在这里插入图片描述
    火转化为空地的密度等于空地转换为树的密度(新长出来的树等于烧没的树)
    在这里插入图片描述
    f是闪电的概率:远远小于树生成的概率;T s m a x T_{smax}T smax
    ​是一大群树被火烧的时间尺度
    程序实现
    周期性边界条件
    购进啊
    在这里插入图片描述
    其中的数字为编号
    构建邻居矩阵
    在这里插入图片描述
    上面矩阵中的数字编号,对应原矩阵相同位置编号的上邻居编号,一 一对应
    同样道理:
    在这里插入图片描述
    (7)交通概念
    车距和密度
    在这里插入图片描述
    流量方程
    在这里插入图片描述
    守恒方程
    在这里插入图片描述
    时空轨迹(横轴是空间纵轴为时间)
    在这里插入图片描述
    红线横线与蓝色交点表示每个时间车的位置。
    如果是竖线则表示车子在该位置对应的时间

    宏观连续模型:
    在这里插入图片描述
    最常用的规则:
    在这里插入图片描述
    红色条表示速度是满的。

    1 加速规则:不能超过v m a x ( 2 格 / s ) v_{max}(2格/s)v
    max(2格/s)
    2 防止碰撞:不能超过车距

    理论分析:
    在这里插入图片描述
    结果分析: 密度与流量
    在这里插入图片描述
    第一个图:横坐标是归一化后的密度,纵坐标是车流量。第二个图:理论值与CA的结果

    结果分析: 时空轨迹
    在这里插入图片描述
    中间的深色区域是交通堵塞的区域。

    二、案例及部分源代码

    1 案例
    随着城市建设的发展,城市道路越来越宽,道路交通网络越来越复杂,人们出行的方式也更加丰富,从最初的步行,自行车,公交车,打车,到如今的私家车,地铁,高铁等。但是,出行方式的增多却并没有改善道路交通状况,道路通行拥堵问题日益凸显。因此,如何优化路网结构,提高路网的密度的问题亟待解决。由于城市道路的固定化,通过改善城市道路来缓解交通压力,收效甚微,而人们对开放小区的认识,为提高道路通行能力提供了一种有效的手段。研究小区开放对道路通行能力影响是一个既有理论意义又有实际价值的研究方向。对于问题一,需要建立合理的指标体系来分析小区开放对周边道路通行能力的影响,通过指标的选取原则,我们选取了 5 个二级指标和 18 个三级指标,并
    根据指标的性质,将指标分为定性指标和定量指标。首先,我们对指标进行定性的分析,得到路网密度等指标对道路通行能力具有促进的作用,交叉口数量等指标起到抑制的作用;其次,我们对指标进行定量分析,利用熵权法对三级指标进行赋权,并利用简单加权平均算子对数据进行融合,从而建立小区开放对道路通行能力影响的定量评价模型。最后,综合定性和定量分析说明建立的指标体系能够有效地评价小区开放对周边道路通行能力的影响。对于问题二,为了得到最优的车辆通行数学模型和小区开放对周边道路的影响程度。本文基于问题一构建小区开放对周边道路通行能力影响指数的最优化模型,同时考虑到小区开放会影响到路网的成本,我们从系统管理者和出行者两个角度提出了小区开放后的用户平衡(UE)模型和系统最优(SO)模型,基于这些模型,我们构建车辆通行的多目标优化模型,考虑到 UE 模型仅仅考虑静态条件下的网络流量配流问题,存在一定局限性,因此,我们构建基于UE 模型的交通流量动态调整和均衡分布模型,最后给出了求解该模型详细的流程图。对于问题三,小区内部道路结构,小区周边道路的结构,以及小区的车流量等都会对小区开放后的效果产生不同的影响,本题中,我们根据小区内部道路的结构将小区分为一字型、十字型和环型小区,根据小区周边的道路结构将小区分为网状、树状、环型和条状小区,同时考虑到不同时段小区附近的车流量也不同,对于不同的类型的小区,我们事先给定总的车流量,然后根据 MSA 算法得到每条路段上的车流量,最后根据问题二中的模型计算出道路通行能力综合评价指数。每天的早高峰时期,环形小区的综合指数最大,通行能力也最好,其次是十字形、一字形和封闭式小区,同理可得,环形小区的开放效果最为明显,其次为网状小区、树状小区和条状小区。对于问题四,构建小区内道路设计和规划模型,将小区内的每条待建道路都看成 0-1 变量,即假设问题二中模型中的开放小区内道路都记为 0-1 变量,通过求解最优化模型,我们可以得到小区内修哪条路对提升道路通行能力的影响最大,最后,综合我们前面的研究成果,给城市规划和交通管理部门提供了关于小区开放对周边道路通行能力影响的详细的建议。
    在这里插入图片描述⛄2 部分源代码
    %% 全国大学生数学建模大赛B题代码主文件.
    %每个格子的状态有三种:
    %用1来表示正常前进车辆,-3表示拐入小区的车辆,0表示空位,-888表示不可进入区域

    %% 初始化运行空间
    clear all;
    %clc;
    warning off;
    dbstop if error
    W = 0;
    %% 模型主要参数设置
    red_light_time = 60;%红灯时间
    green_light_time = 40;%绿灯时间
    fresh_frequency = 0.1;%刷新速率
    num_of_street = 4;%小区道路的数量,也就是交叉口的数量
    global pixellength;%定义全局变量车道长度
    pixellength = 30;%主道的长度
    side_length = 25;%小区边长
    %% 用来统计数据的变量
    global speed_index
    speed_index=0;
    loop_times = 10;%循环`次数;
    time_step_length = loop_times*(red_light_time+green_light_time)/2;
    avr_move_steps = ones(1,time_step_length);
    store_num_of_cars = ones(1,time_step_length);
    store_num_of_jam_cars = ones(1,time_step_length);
    avr_mainroad_move_steps = ones(1,time_step_length);
    %% 生成运行改进后的N-S模型所需的变量.
    B = side_length+1;
    L = 1;
    pixel = create_pixel(B,L,side_length);%生成元胞空间的状态矩阵
    pixel = create_street(pixel , num_of_street+1 ,side_length);%生成小区道路
    pixel_speed = zeros(size(pixel));%小车的速度矩阵,对应所在位置的小车的速度
    temp_handle = show_pixel(pixel,B,NaN);%显示元胞矩阵
    %% 循环刷新每一时步的图像,统计数据.
    for i = 1:loop_times
    waiting_time = 0;
    output = 0;
    entry = 0;
    traffic_capacity = 0;
    if mod(i,2)~=0
    pixel(end,end-1) = 0;%红灯变绿灯
    for xx=1:green_light_time
    [pixel,pixel_speed,move_step,num_of_cars,num_of_jam_cars,avr_mainroad_move_step] = go_forward(pixel,pixel_speed); %前进规则
    [pixel,pixel_speed] = new_cars(pixel,1,pixel_speed); %将生成的车辆加到元胞空间矩阵中
    entry = entry + 1;
    %waiting_time = waiting_time + compute_wait(pixel); %进行求和求总的时间
    %==============
    temp_handle = show_pixel(pixel,B,temp_handle);%刷新图像
    %drawnow
    %==============
    pixel = clear_boundary(pixel);%将要离开系统的车辆,需要将车辆从系统中移除
    %k = k+1;
    pause(fresh_frequency);
    speed_index=speed_index+1;
    avr_move_steps(speed_index)=move_step;
    store_num_of_cars(speed_index) = num_of_cars;
    store_num_of_jam_cars(speed_index)=num_of_jam_cars;
    avr_mainroad_move_steps(speed_index)=avr_mainroad_move_step;
    end
    else
    pixel = red_light_on(pixel);%绿灯变红灯
    for xx=1:red_light_time

            [pixel,pixel_speed,move_step,num_of_cars,num_of_jam_cars,avr_mainroad_move_step] = go_forward(pixel,pixel_speed); %前进规则
            
            [pixel,pixel_speed] = new_cars(pixel,1,pixel_speed); %将生成的车辆加到元胞空间矩阵中
            temp_handle = show_pixel(pixel,B,temp_handle);%更新图像
            drawnow
            pause(fresh_frequency);
            pixel = clear_boundary(pixel);
            speed_index=speed_index+1;
            avr_move_steps(speed_index)=move_step;
            store_num_of_cars(speed_index) = num_of_cars;
            store_num_of_jam_cars(speed_index)=num_of_jam_cars;
            avr_mainroad_move_steps(speed_index)=avr_mainroad_move_step;
        end
    end               
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    end

    %% 绘图与统计
    hold off;
    time_series = linspace(1,time_step_length,time_step_length);
    show_pixel(pixel,B,temp_handle);
    figure(2);
    % title(‘平均车速’);
    % xlabel(‘时步’)
    % ylabel(‘每辆车的平均移动距离’)
    para = robustfit(time_series,avr_move_steps);
    xdata = [ones(size(time_series,2),1) time_series’];
    regress_avr_move_steps=xdata*para;
    %fitresult=createFit(avr_move_steps);
    temp_handle=plot(avr_move_steps);
    legend( temp_handle, ‘每辆车的平均移动距离’ );
    hold on;
    %plot(fitresult);
    title(‘平均车速’);
    xlabel(‘时步’)
    ylabel(‘每辆车的平均移动距离’)
    hold off
    figure(3);
    % title(‘位于地图内的车辆数量’);
    % xlabel(‘时步’)
    % ylabel(‘车辆数量’)
    temp_handle=plot(store_num_of_cars);
    legend( temp_handle, ‘位于地图内的车辆数量’ );
    title(‘位于地图内的车辆数量’);
    xlabel(‘时步’)
    ylabel(‘车辆数量’)
    figure(4);
    temp_handle=plot(store_num_of_jam_cars);
    legend( temp_handle, ‘被阻塞的车辆’ );
    title(‘被阻塞的车辆数量’);
    xlabel(‘时步’)
    ylabel(‘车辆数量’)
    fprintf(‘小区边长:%i\n’,side_length);
    fprintf(‘主路长度:%i\n’,pixellength);
    fprintf(‘小区道路数:%i\n’,num_of_street);
    fprintf(‘一个红绿灯周期内的一辆车的平均车速为:%f 格每时步\n’,mean(avr_move_steps(end-(red_light_time+green_light_time):end)));
    fprintf(‘一个红绿灯周期内的一辆在主道上的车的平均车速为:%f 格每时步\n’,mean(avr_mainroad_move_steps(end-(red_light_time+green_light_time):end)));
    fprintf(‘稳定的位于地图内的车辆数量为:%f \n’,floor(mean(store_num_of_cars(end-30:end))));
    fprintf(‘稳定的位于地图内被阻塞的车辆为:%f \n’,floor(mean(store_num_of_jam_cars(end-30:end))));
    fprintf(‘稳定的主道阻塞率为:%f \n’,mean(store_num_of_jam_cars(end-30:end))/pixellength);

    ⛄三、运行结果

    在这里插入图片描述

    ⛄四、matlab版本及参考文献

    1 matlab版本
    2014a

    2 参考文献
    [1]党珊,蒋太刚,巫承军.基于元胞自动机方法的消防疏散仿真研究[J].现代电子技术. 2022,45(21)
    [2]帅斌,秦梦瑶,许旻昊.基于元胞自动机的高速铁路列车运行仿真研究[J].计算机仿真. 2022,39(08)
    [3]张睿洋.元胞自动机在两类传染病模型中的应用[J].现代信息科技. 2022,6(10)

    3 备注
    简介此部分摘自互联网,仅供参考,若侵权,请联系删除

  • 相关阅读:
    anaconda使用系列教程--3)conda命令详解
    day58| 739. 每日温度、496.下一个更大元素 I
    敏捷开发的在实际项目中的运用
    文心一言 VS 讯飞星火 VS chatgpt (113)-- 算法导论10.2 5题
    微信小程序---npm 支持
    鸿蒙状态栏设置
    Flink 作业管理器:核心功能、角色与责任详解
    读《长安的荔枝》有感
    Springboot毕设项目个人博客系统开ywurw(java+VUE+Mybatis+Maven+Mysql)
    typescript47-函数之间的类型兼容性
  • 原文地址:https://blog.csdn.net/weixin_63266434/article/details/128152645