NS元胞自动机模型–python实现

NS元胞自动机模型–python实现实现 coding utf 8 NS 模型场景 周期型边界道路长度 cell 1000 个元胞车辆初始分布为均匀分布初始速度 v0 vmax 5 随机慢化概率 p 0 1 仿真时步为 2000 时步 从 500 时步开始采样 1 表示元胞 其他值表示车辆要求 绘制车辆加速度的分布图 密度 0 05 0 2 0 4 0 6 im

在这里插入图片描述
实现:

]# -*- coding: utf-8 -*- ''' NS模型 场景: 周期型边界 道路长度:cell=1000个元胞 车辆初始分布为均匀分布 初始速度:v0=vmax=5 随机慢化概率:p=0.1 仿真时步为2000时步,从500时步开始采样 -1表示元胞,其他值表示车辆 要求:绘制车辆加速度的分布图(密度:0.05, 0.2, 0.4, 0.6) ''' #import matplotlib.pyplot as plt import pandas as pd import numpy as np import os #设置车辆初始均匀分布,车辆密度ρ=0.05, 0.2, 0.4, 0.6 def InitDist(v0=5, ρ=0.05, cell=1000): arra = np.zeros(1000, dtype=int)#创建1000个元胞 arra = np.array([-1] * cell) v_count = int(ρ*cell) #车辆数 temp = np.linspace(0, 999, num=v_count).astype(int)#生成均匀分布数 for i in temp: arra[i] = v0 return v_count,arra #返回车辆初始分布与车辆数 #NS建模 def NS(cell=1000, n=InitDist()[0],v0=5, vmax=5, p=0.1,times=2000, start=500): cell_arr = np.zeros((times,cell), dtype=int)#NS模型演化过程表 df = pd.DataFrame(cell_arr).apply(lambda x: x.iloc[:] - 1) df.loc[0,:] = InitDist()[1] #设置车辆初始状态 #根据车辆数n生成相应的任意随机慢化概率,支持文件导入 p_rand = pd.DataFrame() if(os.path.exists('p_array.csv')==False): p_rand = pd.DataFrame(np.random.randint(0, 10, size=(times, n))) p_rand = p_rand.apply(lambda x: x.iloc[:] / 10) p_rand.to_csv("p_array.csv",index=True,header=True) else: p_rand = pd.DataFrame(pd.read_csv('p_array.csv',index_col=0)) #NS演化规则 i = 0 for i in range(times - 1): index = [] #保存车辆所在元胞的下标 d_temp = list(df.iloc[i,:]) #每次取出当前路段元胞的车辆分布情况 p_temp = list(p_rand.iloc[i,:]) #每次取出当前路段车辆的换道概率 for j in range(cell): if d_temp[j] >= 0: index.append(j) #将车辆的当前位置保存 #对每一辆车进行处理 for k in range(n): v = d_temp[index[k]] #获取当前速度 #加速 if(v < vmax): v = min(v+1, vmax) #减速 if index[(k+1)%n] > index[k]: gap = index[(k + 1) % n] - index[k] - 1 #两车相隔gap个元胞 else: gap = cell - index[k] + index[(k+1)%n] - 1#周期型边界,需处理边界问题 if (gap < vmax): v = min(v,gap) #随机慢化 if(p > p_temp[k]): v = max(v-1,0) #print(v) #运动 s = index[k] + v s = s % cell #边界处理 df.loc[i+1,s] = v #更新下一轮车辆状态变化值 df.to_csv("result.csv") return df if __name__ == "__main__": df = NS() print(df) 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227176.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午9:46
下一篇 2026年3月16日 下午9:46


相关推荐

  • pycharm中的虚拟环境安装包失败

    pycharm中的虚拟环境安装包失败pycharm 安装包失败

    2026年3月16日
    3
  • Nexus3的使用[通俗易懂]

    Nexus3的使用[通俗易懂]nexus的简介、安装以及Maven项目中使用Nexus仓库

    2022年7月12日
    21
  • c语言结构体数组怎么初始化,c语言结构体数组初始化「建议收藏」

    c语言结构体数组怎么初始化,c语言结构体数组初始化「建议收藏」最近看一段代码有所迷惑,先简单总结一下。有关结构体数组初始化的问题struct_m_usmart_nametabusmart_nametab[]={#ifUSMART_USE_WRFUNS==1//如果使能了读写操作(void*)read_addr,”u32read_addr(u32addr)”,(void*)write_addr,”voidwrite_addr(u32addr,…

    2022年7月18日
    32
  • B样条曲线的一些基本性质[通俗易懂]

    B样条曲线的一些基本性质[通俗易懂]1.B样条曲线的节点(knotpoint)指的是将区间划分为一段一段的分段点。节点向量(knotvector)则是由多个节点组成的向量。2.B样条曲线的次数(degree)也就是基函数的次数,而阶数(oder)则是次数加1。3.若B样条曲线由n+1个控制点(从P0到Pn),有m+1个节点(从u0到um),阶数为k+1(次数为k),则必须满足m=n+k+1。4.B样条曲线的每个控制点对应一个基函数,所有控制点与对应的基函数的乘积求和可得到B样条曲线的函数表达式。5.B样条曲线具有局部支撑性。第i+

    2022年6月18日
    77
  • intel AVX / AVX2指令学习资源

    intel AVX / AVX2指令学习资源IntelReferenceGuidesIntelIntrinsicsGuide一些解读

    2022年5月30日
    32
  • Navicat免费激活成功教程版安装说明

    Navicat免费激活成功教程版安装说明版权声明 本文为小异常原创文章 非商用自由转载 保持署名 注明出处 谢谢 本文网址 https blog csdn net sun article details Navicat 是一款快速 高效 可视化的数据库管理软件 但它并不免费 那么如果我们想用它做简单的测试来管理我们的数据库 如何可以免费安装呢 本篇主要讲解如何激活成功教程 Navic

    2026年3月20日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号