元胞自动机在交通系统中的应用之二【单车道NaSch元胞自动机模型】

前言

想不到元胞自动机看的人更多,就写写吧。
听说有人想要看,今天就抽时间现场写了个NaSch的很简单的代码

各位大哥,代码是用lua写的,在MicroCity里运行的,不要问为啥报错了?你用前朝的剑来斩本朝的官,能好使么?

第六章 道路交通流中的元胞自动机模型

既然是交通系统中的元胞自动机模型,就需要对现实世界中的交通系统进行分析,了解它的组成和运行机理。而元胞自动机主要的应用领域还是在道路交通流中。包括:

  1. 单车道交通流
  2. 多车道交通流
  3. 双向交通流
  4. 自行车流
  5. 机非混合交通流

当然最简单最基础的就是单车道交通流了,也是其他场景的基础。

6.1 单车道元胞自动机模型

  • 并行更新与顺序更新

  • step 1: 加速

  • step 2 : 减速

  • step 3 : 随机慢化

  • step 4 : 运动
    其实这四步可以归纳成两部分,一是速度状态调整,二是位置状态调整。

  • 边界条件

  1. 周期性边界条件
  2. 开口边界条件
  • 初始状态
local Sim      = AddModule('NaSch','Start')
ROADX          = AddParameter(Sim, nil, 'value', 'The size of the Road at X', 20)
ROADY          = AddParameter(Sim, nil, 'value', 'The size of the Road at Y', 1) 

Vehicle = {}
Vehicle.__index = Vehicle

function Vehicle:new(max_speed, p, x, v)
    local self = {Vmax = max_speed, p = p, x = x, v = v}
    setmetatable(self, Vehicle)
    return self
end 

function Vehicle:setHead(veh)
    self.head = veh
end 

function Vehicle:getDis()
    return self.head.x - self.x - 1
end 

function Vehicle:accelerate()
    self.v = math.min(self.v + 1, self.Vmax)
end 

function Vehicle:brake()
    self.v = math.min(self.v, self:getDis())
end 

function Vehicle:random()
    self.v = math.random() < self.p and math.max(self.v - 1, 0) or self.v
end 

function Vehicle:move()
    self.x = self.x + self.v
end 

function updateRoad()
    for i=0,ROADX do 
        SetValue(road, 0, i, 1)
    end 
    for i=1,#vehicles do
        SetValue(road, 1, vehicles[i].x, 1)
    end     
    Update(road)
end 

function OpenBoundary()
    if vehicles[1].x > ROADX then 
        table.remove(vehicles, 1)
        vehicles[1].head = boundary
    end
end 

function NaSch()
    road = CreateGrid('Nature', 'int', ROADX, ROADY)
    boundary = Vehicle:new(0, 0, ROADX + 2, 0)
    vehicles = {
        Vehicle:new(2, 0.25, 7, 0),
        Vehicle:new(2, 0.25, 6, 1),
        Vehicle:new(2, 0.25, 3, 1),
        Vehicle:new(2, 0.25, 1, 2),
    }
    vehicles[1]:setHead(boundary)
    for i=2,#vehicles do
        vehicles[i]:setHead(vehicles[i-1])
    end 
    local tick = 0

    while GetReady() do
        updateRoad()
        for i=1,#vehicles do 
            vehicles[i]:accelerate()
        end 
        
        for i=1,#vehicles do 
            vehicles[i]:brake()
        end
        
        for i=1,#vehicles do
            vehicles[i]:random()
        end 
        for i=1,#vehicles do
            vehicles[i]:move()
        end 
        
        OpenBoundary()
        
        if tick % 5 == 0 then 
            table.insert(vehicles, Vehicle:new(2, 0.25, 0, 0))
            vehicles[#vehicles].head = vehicles[#vehicles-1] or boundary
        end 
        tick = tick + 1
        Sleep(10000)
    end    
end
  • 3
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
该问题需要结合交通流理论和元胞自动机模型进行分析和建模。以下是建立单车元胞自动机模型的步骤: 1. 确定元胞状态:在单车路上,每个车辆可以表示为一个元胞元胞的状态包括:空(0)、小汽车(1)和货车(2)。 2. 定义邻域:每个元胞有左、、右三个邻居元胞。 3. 确定状态转移规则:根据交通流理论,车辆的速度与密度有关。根据元胞自动机模型,车辆的速度受到前车和随机慢化率的影响。假设车辆的最大速度为v_max,车辆的速度更新规则如下: - 如果当前速度小于等于前车与随机慢化率所决定的距离,则当前速度等于该距离减1; - 如果当前速度小于最大速度,且前方没有车辆阻挡,则当前速度加1。 4. 考虑车辆异质性:货车的长度和前后车距离都比小汽车大,因此货车的速度更新规则与小汽车不同。假设货车的最大速度为v_max/2,则货车的速度更新规则如下: - 如果当前速度小于等于前车与随机慢化率所决定的距离,则当前速度等于该距离减1; - 如果当前速度小于最大速度的一半,且前方没有车辆阻挡,则当前速度加1。 - 如果前方有车辆阻挡,则货车只能以最大速度的一半行驶。 5. 定义边界条件:假设路两端都是出口,车辆到达出口后离开模拟区域。 6. 进行模拟:利用Matlab编写程序,进行交通流模型仿真。可以通过调整随机慢化率和货车占比来分析交通流的变化。 7. 进行可视化:利用Matlab绘制时空位置图和流量-速度-密度图,对交通流的演化过程进行分析和展示。 以下是一个简单的Matlab代码示例: ```matlab %参数设置 L = 100; %模拟区域长度 n = 50; %车数 v_max = 5; %最大速度 p_slow = 0.2; %随机慢化率 p_truck = 0.3; %货车占比 time = 100; %模拟时间 %初始化 road = zeros(L, n); %路网格 speed = zeros(L, n); %车速矩阵 for i = 1 : L for j = 1 : n if rand() < p_truck road(i, j) = 2; speed(i, j) = v_max/2; end end end %模拟 for t = 1 : time for i = 1 : L for j = 1 : n if road(i, j) > 0 %计算前车距离 d = 1; while road(mod(i+d-1, L)+1, j) == 0 d = d + 1; end %更新速度 if road(i, j) == 1 speed(i, j) = min(speed(i, j)+1, v_max); if speed(i, j) > d-p_slow speed(i, j) = d-p_slow; end elseif road(i, j) == 2 if speed(i, j) <= v_max/2 && speed(i, j) > d-p_slow speed(i, j) = d-p_slow; elseif speed(i, j) < v_max/2 speed(i, j) = min(speed(i, j)+1, v_max/2); end end %移动车辆 new_pos = mod(i+speed(i, j)-1, L)+1; road(new_pos, j) = road(i, j); speed(new_pos, j) = speed(i, j); road(i, j) = 0; speed(i, j) = 0; end end end end %可视化 figure image(road*100) colormap(gray(200)) xlabel('车') ylabel('位置') title('时空位置图') figure density = sum(road, 2)/n; velocity = sum(speed, 2)./sum(road>0, 2); flow = density.*velocity; plot(density, velocity, '.') xlabel('密度') ylabel('速度') title('流量-速度-密度图') ``` 通过调整p_slow和p_truck参数,可以得到不同交通流条件下的模拟结果和分析。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值