基于MA和CA的交通空间决策模型

说明

这是个人最近的一些研究,使用.net 2.0作为开发语言,完成了基于MA和CA的交通模型的一个原型。一切只是开始,放在这里希望可以就有关问题做深入讨论。

研究的目的是交通的空间决策模型,包括技术、原型等方面,目前属于个人兴趣和探索性质,没有任何资助。基于CA的交通模型很多,本模型有很多不同点。使用VB.net作为开发语言感觉很得心应手,去年开始对Python感兴趣,但现在觉得,还是VB.net用起来顺手,特别是.net 2.0以后,也许与自己的VB背景有关。

元胞自动机(CA)和Multi-Agent (MA)模型

元胞自动机(CA)和Multi-Agent (MA)模型作为模拟复杂问题的有力工具,在地学领域得到了广泛应用。下面做一个简单介绍。

元胞自动机是定义在一个由具有离散、有限状态的元胞组成的元胞空间上,并按照一定局部规则,在离散的时间维上演化的动力学系统。其特点为:
      每个元胞具有一个状态;
      这些元胞规则地排列在被你为"元胞空间"的空间格网上;
      一个元胞在某时刻的状态取决于、而且仅仅家决于上一时刻该元胞的状态以及该元胞的所有邻居元胞的状态。
     
元胞自动机自产生以来,被广泛地应用到社会、经济、军事和科学研究的各个领域;应用领域涉及社会学、生物学、生态学、信息科学、计算机科学、物理学、化学、地理、环境、军事学;地学和GIS主要用于城市、洪水、火灾、岩浆等的模拟。

Multi-Agent (MA)模型:通过引入多个可感知环境、相互作用的“智能”对象(Agent),在特定的环境中,Agent通过感知环境和周围的Agent来决定自己的行为,从而达到模拟复杂系统的作用。博客堂有一个系列文章(http://blog.joycode.com/grapecity/archive/2005/06/20/55216.aspx),介绍Agent的编程。其实Windows、Office的Agent就是相关研究软件化后的一个实例,好像是90年代的一个小公司的产品,被微软收购后加入的(?)。多Agent(MA)是指Agent之间有作用。

其实Agent不一定需要智能,简单的,例如温度控制器就可以是一个Agent,可以感知温度,大于一个值则关闭,小于则打开。邮件的定时查看(Alert)程序等等,都可以看做Agent的例子。

交通模型:道路

道路采用2种数据模型表示
      网络模型:表示交通网络,道路的宏观特征
      场模型(栅格):宽度、通行性等,道路的微观特征

关于地理空间建模,Modeling Our World 是一本不错的书,个人有一个最近的笔记

基于网络模型的矢量数据集,作为Agent进行路径查询和网络分析的基础数据集;基于场模型的栅格数据集,来模拟实际的道路,CA运算主要作用于此数据集。

道路的宏观规则,例如连通性、通行性等通过网络数据集来建模,利用节点、弧段、网络阻力及其属性来模拟。道路的微观规则由栅格数据集来模拟,为计算方便,将“车辆”统一为1个像素宽,则道路宽窄等于车道的数量。道路宽度对应于一定数量的像素,每个像素定义其4个方向的通行状况,是否被其他车辆占用等属性,使用栅格的属性值表示,可以模拟道路是否单行道、红绿灯情况等。

Demo的实现使用了图来表示网络模型,使用数组表示栅格模型;对于大的系统,则使用GIS空间数据库作为底层数据平台。

交通建模:车辆

车辆为具有行为能力的Agent,具有一定的属性和行为。有2点假设:(1)车辆统一设定为1个像素大小;2)所有车辆速度相同。实现为程序的一个对象。

Agent有以下属性:(1)当前位置(x,y);(2)目的地(x,y);(3)已决定的行车路线,通过一个堆栈表示,堆栈的元素为交通网络的网络数据集中的节点,Agent到达一个节点后即从堆栈删除当前元素,继续向下一个节点前进;(4)停滞不前时间,用于改变路线等决策;(5)行进速度;(6)其他属性,例如性格,紧急程度等,用来在确定路线和修订路线时作为参考。

 

Agent的行为:(1)确定路线,通过当前位置、目的地,应用网络数据集,通过最短或者最优路径获得其行车路线,将路线的节点存储到行车路线属性堆栈;(2)运行到下一个位置,通过判断当前位置周围的情况,通过行车路线属性中下一个节点的方向,确定东、西、南、北方向是否畅通,在不违反交通规则的情况下(例如靠右行使以及红绿灯等情况),从畅通的路线中选择最优路线,到达下一个点,将道路栅格数据集中本点设置为空,而下一个点设置为不空;微观行驶行为决策过程中,需要引入深度搜素和随机行为,前者可以模拟通过一定程度的“绕行”来前进,后者一方面可以避免“一致决策”导致的堵塞情况,另一方面更贴近实际情况(上图为一次决策前进的情况,红色的A、B代表要前进的Agent,蓝色表示被占用,状态2表示其决策后的状态);(3)如果停滞不前达到一定时间,则重新选择路线。其整体决策流程如下图所示。

 

实际程序的深度探索只做了2级,即当前4个位置没有合适的,在可以移动到的位置再各探索一次,没有再深层次的。随机行为主要使用随机数来决定4个方向的探索优先顺序和是否做深度探索。

其中车辆的宏观行为模拟属于MA模拟范畴,微观行车行为属于CA模拟范畴,与其他交通模型不同,其转换规则由Agent的行为决定,CA模型由Agent和道路属性共同驱动。

交通建模:模拟(模型驱动)

模型运行需要5个方面条件:(1)初始化道路数据,包括网络数据集和栅格数据集的初始化;(2)Agent容器,保存所有Agent,模型运行模拟时,可循环处理每一个Agent,也可以通过多线程技术使Agent并发执行;实际运算可以通过并行计算技术将Agent分布于不同的节点计算;(3)Agent发生器,根据规则不断的产生“人-车”Agent,初始化其属性。此发生器的设计需要考虑Agent的初始地点、终点以及其他属性,这些属性可以完全根据一定的分布,例如平均分布或者正态分布来随机产生,也可以通过道路实际情况来设计其分布,或者完全由实际数据不断产生Agent,并加入Agent容器;(4)控制道路的通行规则的变换,例如红绿灯;(5)模型控制器,负责控制道路规则,驱动Agent执行,控制Agent容器行为,如Agent到达终点,则从容器中取出(下图)。

 

编程方面,可以使每个Agent成为一个线程,独立运行,也可以使用循环语句,循环驱动所有Agent,本Demo中使用了后一种方法。从模拟角度,可能使用多线程更贴近现实。

实际使用,可能需要使用并行计算来完成,CA本身又很容易实现为并行程序。例如前边介绍的Alchemi(http://maweifeng.cnblogs.com/category/32846.html)就可以实现基于计算网格的并行计算。

运行结果和结论

运行结果不贴了,有兴趣可以运行试试。

有几点是明显的,即整体速度是波动的,但总体速度和车流量有相关性;不同的红绿灯时间会对应不同的速度;有无红绿灯有很大差别。

需要做的工作还很多,一切只是开始,希望可以继续下去。希望大家多提意见和建议。按钮控制是使用DoEvents做的,所以不灵敏,实在惭愧。模拟的是一个十字路口,车辆随机产生,可以有或没有红绿灯。源代码没有贴的原因是因为程序主体是一个下午赶出来的,实在惨不忍睹。:)

程序下载。下载的程序需要.net 2.0 beat的SDK。

posted on 2005-10-15 13:40  马维峰  阅读(2449)  评论(6编辑  收藏  举报