赞
踩
实现:
]# -*- 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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。