交通系统仿真
实验一单车道车辆生成—行驶仿真主要研究单车道车辆行驶状况的仿真,通过设定符合概率分布的车头时距、路段长度、车辆速度和仿真时长等参数,输出包括每辆车进入和离开路段的时刻。实验采用线性同余方程和反变换法生成随机数,用于模拟车辆的随机分布和行驶行为。实验环境为Python3.10,使用Pycharm进行编程,主函数实现车辆进入和离开的动态仿真,并通过图形界面展示车辆行驶过程。
实验一****单车道车辆生成—行驶仿真
- 实验要求
仿真出东西向单车道路段的车辆行驶状况。
主要参数包括但不限于:
该系统遵循特定的概率分布模式(如指数型概率分布、钟型分布、等概率分布等)来设定车头间距,并自行设定参数。
2)路段长度(定值,输入);
3)车辆速度(匀速,随机产生);
4)仿真时长(定值,输入)。
输出包括但不限于:
- 仿真过程中每辆车进入路段的时刻;
- 车辆速度;
- 每辆车离开路段的时刻。
鼓励使用可视化界面展示,也可以用Console程序输出结果。
实验平台(所使用的实验软件,包括基于Visual C++ 6.0和Visual C++ 2005的开发环境,程序类型为Win32 Console Application)
Python3.10,Pycharm
实验的核心理论基础是基于数学模型的原理及描述。具体而言,该实验通过详细阐述其数学模型的原理及其应用方法,从数值范围和周期性等方面深入探讨了如何生成指定区间内的随机数序列。
1. 线性同余方程产生随机数
x n+1 _=_a x n%m

其中,a和m的选取规则为:
(1)_m=_2j

j取值为某一整数,通常建议选择m值在计算机系统能够表示的数值范围之内。在选择m时,需要综合考虑其伪随机数序列的周期长度约为m除以4,并确保其伪随机性不低于试验的持续时间。
(2) a 一般取与 _a=_2 p2

根据数论原理,最小满足a=8k±3的正整数,其中k为任意整数,p为机器字长。例如,若需要生成一个8000个数的序列(最小单位为1),则根据上述第一条,m应选择最接近32000的值,现取m=215=32768,则机器的字长至少应为15位。由上述第二条可得,a≈27.5。

=181,而与此数最接近的8k±3的数是179,故a取179(k=22)。
2.反变换产生连续随机变量
以产生指数分布随机变量为例:
定义为X的概率分布函数,其中X的取值范围为...,且满足概率分布的基本性质。
F x _=__1-_e -λx ,x≤00,other

令 _u=F(x)=1-_e-λx

可得其反函数:
_x=_F -1 x _=-_1 λ ln _(1-_u)

由于 u∈(0,1)

,则 1-u∈(0,1)

,即随机变量u与1-u的分布是相同的,所以上式可改写为:
_x=-_1 λlnu

import pygame,sys
import numpy as np
import math
#线性同余法
def rd(start,num): #start 为初始值(小于m的奇数),num为取随机数的个数
x = []
a = 179 #a = 2**(p/2),同时接近 a = 8k +/- 3,p就是j
m = 2 ** 15 #m=2**j,伪随机数列的周期为m/4 及 总随机数生成的个数
x0 = start
for i in range(num):
x0 = a * x0 - int(a*x0/m) * m
x.append(x0/m)
return x #返回随机数列表
#产生负指数分布的随机数
def F(u):
x = -1/0.5*math.log1p(u-1) #反变换法
return round(x,5)
#生成符合负指数分布的随机数 列表
def x_e(ls):
ls_x_e = []
for i in ls:
ls_x_e.append(F(i))
lt = [round(i*10,3) for i in ls_x_e] #保留3位小数
return lt
x = rd(11,50) #控制随机数生成种子和个数 列表
v = [i*100 for i in rd(13,50)] #随机生成车辆速度
x2 = x_e(x) #车头时距 列表
#将车头时距处理成每一辆车辆出现时间
x3 = [] #车辆出现时间 列表
for i in range(len(x2)):
s = 0
for n in range(i+1):
s = s + x2[n]
x3.append(round(s,3)) #保留3位小数
#图像移动函数
def cartoon(speed):
# 初始化
pygame.init()
# 设置主屏幕大小
screen = pygame.display.set_mode((800, 500), 0)
# 颜色填充
screen.fill((255, 255, 255))
# 加载图片
imag = pygame.image.load("car.bmp")
# 图片在主屏幕中位置
x = 0
y = 150
pygame.display.set_caption("交通系统仿真")
# 添加事件循环
while True:
# 循环获取事件,监听事件
for event in pygame.event.get():
# 判断用户是否点了关闭按钮
if event.type == pygame.QUIT:
# 卸载所有模块
pygame.quit()
# 终止程序
exit()
# 定义频率
clock = pygame.time.Clock()
# 设定刷新帧率
clock.tick(60) # 越大刷新的越快
# 填充白色,相当于更新屏幕
screen.fill((255, 255, 255))
# 将绘制的图像添加到主屏幕上,(0,150)是位置坐标,显示屏的左上角为坐标系的(0,0)原点
screen.blit(imag, (x, y))
# 横坐标变动,图像移动
x += speed
pygame.display.update() # 更新屏幕内容
if x > 800:
break
#交通系统仿真主函数
def main(road,time):
n = 1
for i in range(time*1000): #时间模拟
for i2 in x3:
if i == i2*1000:
if n ==1:
print('线路长度:{}m'.format(road))
print('仿真时间:{}s'.format(time))
print('{: ^4}车辆进入路段的时刻:{:0>10.4f}s'.format(n,i2))
print('{: ^4}车辆进入路段的速度:{:0>10.4f}m/s'.format(n,v[n-1]))
print('{: ^4}车辆路段的行驶时间:{:0>10.4f}s'.format(n,road/v[n-1]))
print('{: ^4}车辆驶出路段的时刻:{:0>10.4f}s'.format(n,i2+road/v[n-1]))
cartoon(v[n-1])
n = n + 1
print('————————————————')
main(1000,360)
main(800,400)
实验1
