栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

交通系统仿真

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

交通系统仿真

实验一 单车道车辆生成—行驶仿真

  • 实验要求

仿真出东西向单车道路段的车辆行驶状况。

主要参数包括但不限于:

1)符合某一概率分布函数(负指数分布、正态分布、均匀分布等)的车头时距(自己标定参数);

2)路段长度(定值,输入);

3)车辆速度(匀速,随机产生);

4)仿真时长(定值,输入)。

输出包括但不限于:

  1. 仿真过程中每辆车进入路段的时刻;
  2. 车辆速度;
  3. 每辆车离开路段的时刻。

鼓励使用可视化界面展示,也可以用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)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886791.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号