python元胞自动机模拟三车道自动驾驶车辆与人驾驶车辆混合通行

一、 任意车道离开

1.公路模型创建:创建两个二维数组,一个用于保存上一步时状态用于判断,一个用于保存改变后的状态用于更新,在数组中某位置的值表示公路状态,0代表公路此位置无车,1代表公路此位置有人的驾驶车辆,2代表公路此位置有自动驾驶车辆。
2.模拟车辆的进入:由于规定一般条件下前方三个车位的空间内有车辆,此车会在此步时处于静止状态以模拟减速,所以如果每步时对会有随机车辆生成,道路覆盖率会难以控制
因此我么们定义每四步时进行一次模拟车辆的进入,此时将会以定义道路覆盖率生成车辆来模拟车辆的进入,并根据自动驾驶车辆所占比例随机确定车的类型。
3.模拟车辆的前进:遍历数组所有元素,若为含有自动驾驶车辆的公路且满足自动驾驶汽车正常行驶条件,则将其信息传递给右侧元素。若为含有人工驾驶的车辆的公路且前方三个车位空间无车辆,则有20%概率前进两步来模拟加速操作,此外为了模拟人驾驶车辆的不稳定性,我们设定人驾驶的汽车有5%概率前进5%概率后退,来模拟非匀速运动。
4.模拟车辆的离开:若车辆到达模拟公路末端,计数器会加一,然后数组此位置元素换为0完成离开状况模拟,并可以统计通过车量数目
5.模拟更改车道:由问题一可知,人驾驶的车辆具有根据路况更换车道的能力来模拟人的灵活性,所以若在移动时此车辆为人驾驶的车辆,会在一定约束条件下,完成更换车道,即将其值赋给目标车道的相同位置的下一位置。

import numpy as np
import random
import copy
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


def make_car(way, auto_p, car_p):
    if cell_temp[way][0] == 0:
        leng[way] = leng[way] + 1
        if random.randint(1, 100) <= car_p *(1- auto_p) * 100:
            cell_temp[way][0] = 1  # people's car
        elif random.randint(1, 100) <= car_p *auto_p * 100:
            cell_temp[way][0] = 2  # auto car


def move(way):
    for j in range(0, width-1):
        if j==0 and cell[way][0]!=0:
            x = 0
            for i in range(j+1,j+4):
                if cell[way][i]!=0:
                    x=1
            if x==0:
                cell_temp[way][1]=cell_temp[way][0]
                cell_temp[way][0]=0
        elif cell[way][j]!=0:
            if change_way(way, j) == 1:
                continue
            x = 0
            for i in range(j+1,min(j+3,width-1)):
                if cell[way][i]!=0:
                    x=1
            if x==0:
                if  j+3<width-4 and cell[way][j+3]== 0 and cell_temp[way][j]==1 and random.randint(1,100)<=20:
                        cell_temp[way][j+2]=cell_temp[way][j]
                        cell_temp[way][j] = 0
                        k = j+2
                else:
                    cell_temp[way][j+1]=cell_temp[way][j]
                    cell_temp[way][j]=0
                    k=min(j+1,width-2)
                if cell_temp[way][k]==1:
                    if random.randint(1,100)<=5 and cell_temp[way][k-1]==0:
                        cell_temp[way][k-1]=1
                        cell_temp[way][k]=0
                    elif random.randint(1,100)<=5 and cell_temp[way][k+1]==0:
                        cell_temp[way][k + 1] = 1
                        cell_temp[way][k] = 0


def remove(way):
    if cell_temp[way][width-1]!=0:
        leng[3] = leng[3]+1
        leng[way] = leng[way] -1
        cell_temp[way][width-1]=0


def change_way(way,local):
    m = 0
    n = 0
    if way ==1:
        if leng[way]*2/3 > leng[way+1] and leng[way]>10:
            for i in range(local-3,local+4):
  • 5
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
动机(Cellular Automaton,CA)是一种离散的、自动的计算模型,由一个规则网格(grid)组成,每个网格单元被称为细(cell),且每个细都有一定的状态。在元动机中,时间是离散的,系统的演化是通过在每个时间步骤中,根据一定的规则更新每个细的状态来实现的。Python提供了丰富的库和工具,可以用来实现元动机的模拟和可视化。 以下是一个简单的Python代码示例,用于实现基本的元动机模拟: ```python import numpy as np import matplotlib.pyplot as plt # 设置元动机的规模和初始状态 grid_size = 100 # 网格大小 num_steps = 100 # 模拟步数 initial_state = np.random.randint(2, size=(grid_size, grid_size)) # 随机生成初始状态 # 定义元动机的演化规则函数 def evolve(grid): new_grid = np.zeros_like(grid) for i in range(grid_size): for j in range(grid_size): # 根据邻居细的状态更新当前细的状态,这里使用了经典的Game of Life规则 live_neighbors = np.sum(grid[max(0, i - 1):min(i + 2, grid_size), max(0, j - 1):min(j + 2, grid_size)]) - grid[i, j] if grid[i, j] == 1: if live_neighbors in [2, 3]: new_grid[i, j] = 1 else: if live_neighbors == 3: new_grid[i, j] = 1 return new_grid # 模拟元动机的演化过程 state = initial_state for step in range(num_steps): plt.imshow(state, cmap='binary') plt.title(f'Step {step + 1}') plt.show() state = evolve(state) ``` 上述代码使用了NumPy库来处理网格的状态和更新操作,并使用了Matplotlib库来可视化模拟的过程。其中,演化规则函数`evolve()`实现了经典的Game of Life规则,根据细周围邻居的状态来更新当前细的状态。在模拟过程中,每个时间步骤都会将当前状态绘制出来,最终形成一个动画效果。 通过修改演化规则函数和初始状态,你可以实现各种不同的元动机模拟。希望这能帮助到你!如果有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值