如何写一个交通仿真软件-(三) 梅花桩

关注交通仿真公众号,获取更多精彩文章

未来的汽车是怎么跑起来的。

从滴滴交通大脑看交通仿真软件的创新变革。

还有更多资讯,请扫码关注。

 

 

一直不愿意系统性描述我已经思考或者做过的工作,原因两个:

1、写仿真软件的基础思路,这个题目很庞杂,这里水太深,大鱼小虾,无从下网,挂一漏万,水平所限写起来很不好操作。

2、对读者最感兴趣的部分把握不准,写起来就更没有针对性。尽管这样困难,写一些,是给予一些鼓励我的爱好者最好的回馈。

 

原理部分我不引入复杂理论,理论功底也不足,就尽量用老百姓听得懂的语言解释说明。

一、仿真软件如何运行

本软件以时间驱动的仿真运行原理。

(一)仿真软件的动画的原理:

       仿真动画其实不是仿真软件最核心的技术。设想有一组按照时间顺序拍摄的照片,将每张照片按顺序以每秒钟25张的速度播放,由于人眼的错觉,会自动将认为这些卡片的内容关联起来,形成动态的效果,这就是电影和动画的基本原理。因此,仿真动画只要保证以每秒超过25次,绘制每个仿真步骤各个元胞在空间的位置即可形成动画效果。

(1)在一个excel表格组成的cell网格空间,用色块代表车辆,各色块按照一定的规则移动并发生相互作用(换道、超车、加减速),每仿真秒移动一次。

(2)用记录每一秒色块的位置,每一秒色块移动的网格个数(即速度)等数据。

(3)每仿真秒将色块的上一秒的网格画成空白,并画上新的色块。

(4)回到(1)重复执行,直到仿真停止。

(二)仿真核心模型更新运行的原理:

 

将交通仿真系统每个仿真步骤分为交叉口更新和道路更新两个阶段,分别建立交叉口等待队列A和道路等待队列B。

元胞状态的更新流程分为4个阶段:

1、更新道路的元胞自动机状态,将驶出道路进入交叉口的元胞列入交叉口的等待队列A;

2、更新处理等待队列B,将其状态更新到进入道路;

3、更新交叉口状态,将进入路段的元胞列入道路等待队列B;

4、更新交叉口等待队列A,将其进入交叉口内部,回到步骤1。

     注意以上每个步骤的顺序是不可以调整的。否则会导致仿真结果和仿真软件的

(三)仿真软件的控制和持续运行原理:

仿真软件控制的核心是一个有条件的无限循环,

在基于消息驱动的windows运行环境下,需要注意采用一定的thread.sleep 函数防止计算机进入循环后,计算速度过快,导致界面动画更新过于频繁(结果就是什么都看不见,闪烁),调用application.doevents函数fang'zh防止仿真控制界面的事件迟迟得不到处理(如停止仿真的指令)。

 

简单而言,就是写一个控制循环实现步骤(二)

以下伪代码提供一个实现的思路:

//启动第一层无限循环

 

while(true) {

//退出无限循环的条件:程序发出了退出命令或者仿真到了设定的仿真时长

if (bIsExit == true||ISimCtx.iCurrTime>= iSimTimes)

{

//调用程序退出时候应该做的事情,比如,发送一个通知对话框,告诉仿真结束。

}

//退出第一层无限循环

break;

}

//线程休眠指定时刻,以降低仿真速度,否则,动画和数据更新太快,根本看不见仿真的过程。该指定时刻也是确定仿真速度快慢的重要参数。

写过无限循环的程序员应该知道,在dos时代和windos3.1这样的单任务操作系统时代,这样的无限循环代码是要导致死机的。多任务操作系统可以保证操作系统不死机,就是别的程序可以相应,但不能保证我们的仿真程序不死机。

Thread.Sleep(iSimInterval);

//处理应用程序界面事件。如点击鼠标、点击菜单等,这句代码是保证仿真控制程序的界面还能对线程发出控制指令的关键。也是保证程序不死机的关键。

Application.DoEvents();

 

if (bIsPause==false) {//如果没有暂停

 

//启动第二层有条件的循环,当仿真超时停止运行

while (ISimCtx.iCurrTime++ <= iSimTimes)

{

 

if (bIsExit==true||bIsPause  == true)//退出或者暂停都停止循环

{

退出;

}

//以下两端代码原理同上。

 

Thread.Sleep(iSimInterval);

Application.DoEvents();

 

循环更新交叉口;

foreach (XNode item in irn.XNodes)

{

if (bIsExit == true || bIsPause == true)break;

item.UpdateStatus();

}

//循环更新路段

foreach (Way item in irn.Ways)

{

if (bIsExit == true || bIsPause == true)break;

//首先更新自己。利用访问者模型是外在驱动Cell的一种思想

item.UpdateStatus();

}

//路网仿真时间计数器更新

irn.iCurrTimeStep = ISimCtx.iCurrTime;

}

}

}

二、仿真软件的几个关键技术

从交通的角度来讲,仿真软件是把驾驶员的对车辆、道路、信号等基础设施的及进行不断反馈调整的过程,因此,仿真是一个如何通过模型更精确的描述驾驶员行为的过程。仿真优化研究,是在此基础上,研究什么样的管理控制(渠化、交通管制、VMS、交通信号控制)模型能对整个交通系统运行效率进行提升的过程。

这样的一项工作,也就是大多数学者发表的海量论文所描述的各自的研究成果(关于交叉口渠化、信号控制的论文多到夸张的地步,大部分沉淀在各种学术数据库中)。

从软件的角度来讲,仿真软件是如何对路网、路段、交叉口中车辆、信号的状态进行记录,并随着时间推移按照指定的规则(驾驶员模型、信号控制模型),对其各自状态进行更新记录的迭代过程。

这第二项工作,已有很多先驱做了很多工作。有商业性的,如vissim,paramics,transmodeler等,各有各的优点,有些商业软件在行业应用中取得了很大成就。也有研究性的,但在在学术应用,即对第一项研究工作的支持方面较为成功的软件还较少。大部分交通专业研究人士,难以自己开发一个支撑自己研究成果的原型系统。技术壁垒,也就是用软件的视角(而不是论文)去描述自己的成果这项工作,对交通专业人士来说是非常高的。

因此,主要的壁垒有两点:

1、如果从软件设计的原理层面,能够有足够强大的支撑能力,满足对各种交通元素进行仿真和建模。而且,理想状态下,软件对交通模型的限制足够少,以至于对现实交通系统的仿真逼真程度,只取决于交通模型本身的精度。这对软件的设计原理有相当高的要求,即使成功的商业软件,也是一个对现实世界的模拟系统,也就存在模拟不够逼真的问题,比方说vissim的车辆穿越车辆的问题,很有可能就是软件原理层面的设计缺陷造成的,即使在其他方面的模拟方面,它取得了相当高水平的成果。

2、如何允许仿真建模者,只用数学模型(即很多学者擅长的公式,方程)就可以替代仿真软件内建的模型,以真正意义上实现对交通建模学者的支持。这样足够低的门槛,就允许仿真建模者只关心交通模型本身(通常是数学公式和方程),就能通过仿真数据和仿真动画,检验自己模型的可行性和精度。这对软件的设计者,也是一个很高的要求,却是一个很新引人的方向。

三、部分爱好者的兴趣疑问解答

(1)我最感兴趣的是对于驾驶员行为模型这块的描述

这一块我一开始就打算自己实现一个最基本的,然后换道、跟车、加减速等模型开放出来,让使用者自己编辑模型,仿真平台只是负责运行和展示使用者自己模型的运行效果

(2)还有车辆对于路径选择的描述,当然这块的核心还是驾驶员行为

车辆路径选择使用logit模型(路线选择里面的一个),核心是最短路算法,按照拥挤度(路段运行速度)或者其他参数如路段参数赋权,定义一个起点到终点的路段。用图的理论搜索最短路,每条路线都赋给单独的一个车辆。车辆按照路线依次通过每个路段(way),交叉口(XNode),最后到达目的地。

 

针对仿真软件原有的缺点,对仿真软件的基础构架进行完善,这里引入元胞空间的概念。原有仿真软件缺陷是:无法表示倾斜的道路。道路和交叉口必须是矩形或者正方形。引入元胞空间之后这个局限被打破。

 

(未完待续。。。)

---------------------------------

首先建立一个元胞空间数据结构。仿真软件对元胞空间数据结构的的基本要求有:

1、快速判断某一点Grid处 xy是否是元胞空间内的点。这种判断性能要求高,哈希表是不二之选。

2、仿真动画绘制模块需要利用元胞空间内的点绘制元胞空间的形状。如道路、交叉口等。

3、换车道、加减速、交叉口XNode冲突规则制定。冲突避免等,都需要快速定位元胞空间内Gird点坐标

需要对元胞进行快速前后遍历。双向链表当仁不让。

 

最终,结合以上能需求。元胞空间是一个组合的数据结构,哈希表和链表组合的新的数据结构,兼顾不同需求的元素操作性能(添加、删除、遍历、前后快速访问)。

代码如下:

 

转载于:https://my.oschina.net/u/214547/blog/365368

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值