实验一 单车道车辆生成—行驶仿真
- 实验要求
仿真出东西向单车道路段的车辆行驶状况。
主要参数包括但不限于:
1)符合某一概率分布函数(负指数分布、正态分布、均匀分布等)的车头时距(自己标定参数);
2)路段长度(定值,输入);
3)车辆速度(匀速,随机产生);
4)仿真时长(定值,输入)。
输出包括但不限于:
- 仿真过程中每辆车进入路段的时刻;
- 车辆速度;
- 每辆车离开路段的时刻。
鼓励使用可视化界面展示,也可以用Console程序输出结果。
- 实验环境(用到的实验工具,软件编程环境如工具,如使用Visual C++ 6.0/Visual C++ 2005,程序类型 Win32 Console Application)
Python3.10,Pycharm
- 实验原理(数学模型原理及描述。如从范围、周期等方面阐述产生一定范围内随机数的原理)
1. 线性同余方程产生随机数
xn+1=axn%m
其中,a和m的选取规则为:
(1)m=2j ,j是某个整数,m一般选择在机器所能表示数的范围内,同时还要考虑公式计算得到的伪随机数序列的周期为m/4,它应大于试验的持续期。
(2) a 一般取与a=2p2 最接近而又满足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的分布函数为:
Fx=1-e-λx,x≤00,other
令u=F(x)=1-e-λx
可得其反函数:
x=F-1x=-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)



