已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Repast简介Repast(Recursive Porous Agent Simulation Toolkit)是芝加哥大学社会科学计算研究中心研制的多主体建模工具,她提供了一系列用以生成、运行、显示和收集数据的类库,并能对运行中的模型进行“快照”,记录某一时刻模型的当前状态,还可以生成模型运行过程中状态动态演化的视频资料。Repast从Swarm(用来给复杂性过个体行为建模, 用于对经济行为的复杂性研究仿真. 他在美国新墨西哥州的 Santa fe 研究所得到开发)中借鉴了不少的设计结构和方法,但由于Swarm对建模者来说还是有些过于复杂,Repast项目希望提供一系列简化Swarm模型开发的Java类库。Repast项目拟定了三个设计目标:使用方便、容易学习和容易扩展。设计者通过让模拟软件的底层结构具备抽象性、可扩展性以及“良好”的表现来实现这些目标。Repast建模相当于设计一个状态机,状态机的核心状态是模型中所有成员的集体状态属性集合。成员则分为底层结构和表层结构。底层结构是各种各样用于运行模型、显示和收集数据等架构的机制;表层结构是设计者创立的模型。底层结构的状态就是模型的种种显示状态、数据收集对象的状态等等;表层结构的状态指模型的描述状态,比如所有主体变量的当前值,模拟环境空间的当前状态值,或他们运行的空间以及别的可能有的各种表层对象(例如聚合“协同”的对象统计值等)。在这种状态机模式下,所有对状态机的改变都通过同一对象界面借口来实现,这个对象界面接口是SimModelImpl类。这种设计为建模者减轻了学习负担,也简化了在工具包的功能不足时的扩展编程。Repast一共有数百个类,封装在11个库中,下面对几个主要的类库进行简要的介绍。Analysis库(分析库)分析库中的类是用来聚集、记录数据以及建立数据表。通过使用DataRecorder类,建模者能够将收集到的数据分类整理,并将这些数据以表格格式写入文件。这个库对于数据挖掘有着实际的作用。Engine库(引擎库)引擎类负责建立、操纵和运行模型。simModel借口是Repast中所有模型的超类。作为simModel的一个子类,simModelImpl类可以作为绝大多数用Repast创立的模型的基类。库中包含的控制类(BaseController、Controller、Batch-Controller)负责通过图形用户界面处理用户交互,或通过批处理参数文件自动处理交互。时序表及相关行为类主要用来改变模型中的状态。Event库(事件库)事件库负责监听复选框的变化以及滑动条的滚动事件等。Games库(博弈库)博弈库中包含了一些建立对策论模型(如囚徒困境模型)所用的基本类。GUI库(图形用户界面库)GUI类负责实现模型的图形可视化,包括对图形界面显示的快照功能以及制作模型运行的活动录像。多个Display类与Space空间库中的类协同工作,把空间位置关系的抽象和空间关系的显示分离出来,可以针对不同的空间特征设计不同的可视化显示方案。通过一个显示界面DisplaySurface显示出来。Painter类处理这些空间库在屏幕上的显示,simGraphics类可用于显示出图片或者文本,而显示界面本身就能够完成对所显示对象的探测。对于支持鼠标点击的可视化模拟对象点击鼠标左键,就会弹出一个窗口,其中显示被点击的主体的当前状态。Math库(数学库)数学库中包含一些用于数学处理的类,用于一些特定的需要的模型。Network库(网络库)网络库包括实现网络仿真的类,例如缺省的节点和边的类,各种特殊定义的可记录网络数据的记录类。Space库(空间库)空间库主要包括创建网格、圆环面等空间关系的类,所有Agent互相之间都有一定的空间关系,此类包主要包括实现这些空间关系的类。空间类是表述各种空间的基础容量类。这些空间类允许在x,y坐标轴的基础上对对象进行分类概括和检索。空间库还包含了一些节点类和链接类,以方便建立基于网络的模型。空间类和在GUI库中的显示类协同操作,以实现空间和对象的可视化。在RePast中,空间(spaces)的存在有两种目的:(1)作为空间型主体的基类,比如附带的示例模型 Sugarscape中的SugarSpace或InfiniteLifeSpace;(2)作为主体的容器,定义主体间的空间位置关系。Repast主要提供了两种空间对象:网格空间和网络空间。当研究多个 Agent在一定空间内的活动时可使用网格空间,网格空间被划分成许多元胞(cell),其中每个元胞可以同时容纳个一个或多个Agent,并按照一定的规则,网格的状态不断发生变化。具体的类在此不予叙述。Util库Util类库中只有一个类:SimUtiltities。该类提供了一些产生无序表单、显示信息对话框等静态方法。除了Repast自己提供的类,它还充分利用了第三方软件提供的扩展类库,尤其是Colt库。Colt库通过Mersenne Twister 的工具为Repast提供随机数据,而Mersenne Twister被认为是目前所知最好的假随机数生成器之一。Colt库中还包含其他各种能在Repast中使用的随机数生成器和随机分布。模型的框架通常我们可以通过继承SimModelImpl类来建模,SimModelImpl类的UML类图如图所示:它通过一定的顺序执行特定的步骤来建立需要得到的仿真模型。一般来说,在我们新建立的模型中,我们需要首先实现的是如上所示的几个方法。这些方法的执行是按setup() - getInitParam() - begin() - buildSchedule() - buildModel() - buildDisplay()- step()顺序依次执行的。其中,setup()方法主要完成一些模型建立前的准备工作,例如清空一些模型参数,初始化schedule和显示窗口的声明和注册,getInitParam()方法可设置供运行开始前需要临时设置的参数,通过begin()方法来依次执行后面的buildSchedule() - buildModel() - buildDisplay()三个方法达到系统初始化的效果。Step()方法为调用实现模型中的各种行为的方法,这个方法控制了模型的工作方式。通过在buildSchedule()方法中设置仿真的时钟机制时,将step()方法作为其每一步动作所调用的方法,来实现仿真平台的有规律、可控制的运作。当然,凭借着Repast平台的易扩展性,我们可以很方便的在新建立的模型类中添加我们需要的实现必要功能的方法,也可以直接去改写已有的这些方法来实现需要的特定功能。在我们所用到的具体应用中,即以九寨沟为背景的面向旅游景区的灾备演练仿真平台,首先,我们需要将景区的地理信息导入到模型中,为了更好的模拟出显示的状态,在此我们用到了RasterSpace类,这个类可以用于表现出地理数据的二维网格。在这里面的每个单元格可以包含一个对象,在这个空间中移动可以用距离、坐标系或者离散的单元格位置,为了将模型中的实际变化动态的显示出来,我们用到了Object2DGrid类,这个类描述的是一个离散的二维网格,每一个网格中可以放置一个对象。通过这两个类的配合使用,对象的逻辑上的移动在RasterSpace上进行,而视觉的上的移动则在Object2DGrid上来实现,RasterSpace中有两个方法:getCellColl(double x)和getCellRow(double x),通过这两个方法可以方便的实现RasterSpace坐标向Object2DGrid坐标的转换。在向RasterSpace类中导入地理信息时,用到了它特定规则的一个流数据文件,它能够通过事先约定的特定标记来识别出文件中的一些相关信息,如:ncols81 /代表二维地图的列数nrows90 /代表二维地图的行数xllcorner528000.00 /代表二维坐标原点x坐标yllcorner500000.00 /代表二维坐标原点y坐标cellsize90 /代表每一个网格所占据的二维坐标长宽NODATA_value-9999 /代表用于指代此处无地理信息值的数字紧接在后面的是一个行列分别对应着上面nrows和ncols的二维矩阵,矩阵中的每一个值都代表着特定的信息,这些值将在仿真的过程中起着重要的作用,我们可以使用不同的值去代表我们约定的一些特定信息和性质。例如,在本例中,使用数字0代表不可通行的野地路段,使用数字2代表景区内的河流和湖泊,使用其他数字代表可以行走和行驶的路面,1代表一般的行车路段,84x(x代表任意数字)代表车站,80x(x代表任意数字)代表各个景区的入口点。X3(x属于47)代表景区分范围的出口点,x(x属于47)代表景区分范围的入口点等等,任何想要用到的标识信息都可以简化为数字来代表加入到这个代表地理信息的矩阵中。在建立好景区的地理信息的平台之后,就可以引入景区中所包含的一些具体的对象了,例如景区的景点,车站,车辆和人等等,对于每一类型的对象,定义了三个类,分别是-各自的对象类,用于定义不同类型的对象和它们自身拥有的一些特征参数:scenic、bus、person;各自的工厂类,用于产生具有特定的性质的单个对象:scenicFactory、busFactory、personFactory;以及各自的对象调度(容器)类,用于控制在仿真模型运行中各自的调度问题:scenicContainer、busContainer、personContainer。整个模型的运行过程大致如下:在开始运行平台后,系统会开始初始化,首先会调用begin()函数,首先,通过buildSchedule()方法设置好模型的时钟机制schedule,控制模型在之后的时刻按照这个schedule进行相应的方法调用和操作,然后,开始建立具体的模型,此时执行buildModel()方法,在这个方法里涉及到了初始化模型内包括的所有对象,包括人物对象、车辆对象、景区对象、还有代表景区环境的容器对象和地图的点阵点对象等等。在完成了模型的初始化之后,就是创建显示机制的步骤,这里需要注意的是,由于各个图层的绘制显示是顺序执行的,因而先前绘制的图层会被后面绘制的对象所覆盖掉,因此需要对显示的先后顺序加以注意。对于图形的显示,平台采用了首先将需要创建显示的对象加入一个可供维护及更新用的各自的对象列表即ArrayList,然后将这些对象列表通过DisplaySurface类的addDisplayable()方法将这些对象列表按特定顺序依次加入到显示界面中,然后通过实时同步的刷新列表对象显示,达到动态的显示各对象行为的效果。此处还有另外一个实用的方法即addDisplayableProbeable(),通过这个方法添加到显示的对象在容器中将会获得一个额外的特性,即可点击性(Probeable),当点击这些对象时,将会返回一个弹出窗口,里面将会列出该对象相关的一些参数状态信息。在初始化模型成功之后,当我们单击运行按钮时,平台的仿真便开始执行了。仿真按照既定的schedule来执行,例如对于这样构造的一个schedule:schedule.scheduleActionBeginning(1, this, step);1表示仿真的执行从第一个时刻点tick = 1时开始执行,“step”指代的是每一步执行将要调用的方法名,schedule通过不停的调用step方法来实现平台的仿真运行。在模型主类JZGGisModel中的step()方法中通过向下调用各个对象的step()方法来实现对所有对象的模拟运行。在step()方法的末尾一句是用于更新显示的:DisplaySurface.updateDisplay(),通过执行这一句话在每一步各对象的行为改变后对显示进行更新可以实现动态的显示模拟。各个对象1. Person、PersonContainer、PersonFactorycreatePerson()PersonFactoryPersonPerson()spaceworldcreatePersonAt1()Create*xyagepersonpersonpersonpersonpersonpersonPersonContainerinitialPerson()countPerson()personArrival()personLeave()getOnBus()、getOffBus()BusesgoToScenic()、backToStop()、play()ScenicsPerson类即景区的人物类,主要是对游客行为进行模拟的类,也可以通过对参数的不同设定模拟出不同种类的人群,例如老人、小孩、残疾人等等。每一个person对象都包含了大量的信息,每一个person都必须对自己的状态有一个完整的维护,例如此时是否在景区游玩、是否在车站等候、是否在车站、是否进入景区、位于哪一个具体的景区、是否遭遇灾难以及自己的游玩时间和游玩策略等。Person类拥有自己的step()方法供上一层对象调用,在这个step()方法中,包括了根据当前person的状态来决定这一步应该执行的动作,例如person当前的状态是位于车辆上跟随车辆移动,则执行person的move()方法来对person进行移动,如果当前状态是正处于景区内游玩的状态,则执行person的play()方法,使person在自己所位于的景区范围内自由的移动游玩,如果游客此时的状态为遭遇灾难,此处可加入人员的疏散模拟,判断不同的灾难情况,选择相应的疏散策略。则使游客回到安全地带等候救援车辆,在最后还根据person所遇见的路况信息来判断person位于哪一个区域,改变自己的状态信息。Person的move()方法的关键部分是判断是否满足上下车的条件,并且实现上下车的动作,当person的状态是“不在车上”且“正在等待”时,就可以在新的乘客未满正常车辆(救援车辆不允许)到达的时候上车。乘客上车后,保存自己所在车辆的ID,然后根据车辆的移动进行相同的移动;在到达景区时,需要判定该处是否可以下车,在“该景区的游客数量未满”且“该景区未出现紧急情况”时,可以下车,下车后执行goToScenic()方法,该方法使游客可以从下车的地点到达景区位置,游玩完成后将执行一个逆方法backToStop()可以使人物从景区返回该景区对应的一个候车点。Play()方法实际上是一个简单的随机移动方法,只需要在移动时将person对象限制在特定的空间内。PersonFactory类即控制产生所需要产生的人物类,通过在此类中调用person类的构造方法同时赋予不同的参数值,例如需要构造的人物年龄、性别等性质,可以构建出一系列具体的构造方法,例如creatPerson()、creatOldPerson()、creatChild()等等方法可以分别构造出普通成年人、老人和小孩。一般情况下是在PersonContainer里面初始化人物对象时或者在仿真期间加入新的人物对象是用到此类,该类和即将提到的PersonContainer类都采用了单实例的构造方法,防止冗余对象的产生,也便于程序的管理。PersonContainer类负责对众多person类对象进行系统的调度和管理。此类主要维护了两个游客对象的list,即模拟的一天游玩游客集合personList和正在游玩的游客集合personArrivedList。在初始化时,利用PersonFactory类的构造方法初始化游客人群并且加入到personList列表中,之后按照一定的到达率将personList中的人物对象取出并且加入到personArrivedList中,模拟出人不断到达景区的状态,在该类中,personArrival方法控制了人物的到达率服从泊松分布,泊松分布的期望值通过用户设置得到,在方法中调用编写好的泊松随机分布随机数产生函数产生一个服从泊松分布的随机数流,然后按照这个随机数流来进行人的到达调度。在这个类中还有一个负责统计人物状态信息的方法countTheAgents(),可以统计景区内的人数,各分片区的人数,各车站候车人数等。该类的step()方法调用每一个进入到景区的游客对象的step()方法,实现人物的各种行为,可以在step()的末句调用countTheAgents()方法,实现对人物状态信息的实时统计,可以为景区的管理工作提供一些有价值的参考。2. Bus、BusFactory、BusContainer他们之间的关系与person相关的三个类相似。createBus()BusFactoryBusBus()spaceworldcreateBigBus()Create*velocityroutinecapacitysmallBusbigBusBusBusBusBusBusContainerinitialBus()distrubuteBus()createSmallBus()getOnBus()、getOffBus()PersonsStop()、park()ScenicsBus类即景区内运作的车辆类,景区内有各种各样不同的车辆,例如车辆的容量不同,车辆类型有救护车、交通车、消防车以及景区巡逻车等等,可以通过设置不同的参数得到。要获得一个完整意义上的车辆,车辆必须初始化以下参数:车辆所位于的空间、车辆的基本行车速度、车辆的运行线路、车辆的载客限量、车辆的类型、以及车辆的ID号,由于车辆是一个易变的并且循环使用的对象,所以在该类中加入了用于方便设置车辆参数的方法setbusParameter()可以方便的更改车辆参数如容量、速度和线路。车辆的行车线路产生利用的是迷宫算法(path类),迷宫算法有这样的一个功能:在一个2维矩阵空间中,一旦约定了代表可以行驶的数据值,给定一个起始点和一个目的点,它能够自动的寻找出一条通行路线。这样的设计给车辆调度提供了方便,我们可以通过随机产生的情况得到对应的解决策略,然后实时的获取正确的一条行车线路,可以绕开灾难险要路段以及车辆拥堵的路段。同样,Bus类拥有自己的step()方法供上一层对象调用,在这个step()方法中,调用了Bus的移动方法moveByPoint(),即根据一条既定的路线点链表进行移动。通过setbusParameter()方法赋予车辆一条线路,将会把这条线路包括的一系列点通过一个list对象传给车辆,然后在move()方法中按照先后顺序依次走完list中的每一个点,达到车辆按线路运行的目的。Bus在运行的过程中,会根据地图信息来判断所达到的点是否有景区、停车场、是否允许停靠等信息。BusFactory类的作用和原理与PersonFactory类完全相似,在此不再重复。BusContainer类是一个比较重要的类,它不仅需要维护各种类型车辆列表,还要负责管理车辆的调度问题包括发车、收车、停车、紧急疏散、险情抢救等重要问题。发车逻辑采用按间隔发车和按需求发车相结合的策略,并且根据景区内人口的分布情况实时的调度车辆的发配策略,达到节约成本和方便交通的目的。首先会对景区的车辆进行初始化,即initBuses()方法,由于景区车辆的数量及类型是相对人来说是比较确定而且数量较少的,所以在初始化的时候可以将每一个车辆具体的初始化到各自的车站以备调度使用,busContainer()的step()方法有两个作用,一是让所有属于正在运行的汽车列表busList内的车辆各自运行自己的step()方法,二是判断正在运行列表中的车辆是否已经完成行驶任务到达目的地,若已经到达,则回收到对应的车站list中重新等待新的调度。发车有两种情况,一是当人口到达速度不是十分大时,按照规定间隔发车,如每15分钟发一班车;二是当人口到达数目很大时,为了避免人口堆积,将采用客满即发的方式。发车逻辑优先考虑发出应急救援车,并且将控制同时位于景区内车辆的最大数目,避免出现堵车的情况。3. Scenic、ScenicFactory、ScenicContainerScenic类即景点类,简单地,也可以将景区内的车站看做是一个景点。景点类的功能是实现对一个景点的人数统计及报警控制,并且每一个景点都拥有自己的服务率,这个服务率服从负指数分布,在仿真运行时,景点对每一个游客的服务时间都按照这个负指数分布随机数流来获得。Scenic类内部自带一个统计自身拥有游客数目的计数器,当一个游客进入这个景点时,该计数器加1,反之该计数器减1,可以达到统计人数的目的,同时每一个景点又有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《分子生物学检验技术》课程标准
- 深度解析(2026)《GBT 35780.2-2017顾客联络服务 第2部分:使用顾客联络中心服务的委托方要求》
- 深度解析(2026)《GBT 35716-2017全封闭电动机-压缩机用热保护器》
- 深度解析(2026)《GBT 35596-2022硼硅酸盐玻璃吹制耐热器具》
- 《DLT 1033.2-2006电力行业词汇 第2部分:电力系统》(2026年)合规红线与避坑实操手册
- 历史(中国古代史)题库及答案
- 财务工作思路及计划书
- 学校档案员岗位职责
- 水利工程(水工结构)试卷及分析
- 云安全认证题库及详解
- LY/T 3408-2024林下经济术语
- 金蝶财务软件旗舰版或K3系统存货核算的实际成本法操作手册
- 【MOOC】英国小说-南京大学 中国大学慕课MOOC答案
- 【MOOC】新媒体文化十二讲-暨南大学 中国大学慕课MOOC答案
- 第4课 吃动平衡 健康体重 课件-2024-2025学年人教版(2024)初中体育与健康七年级全一册
- SMP-07-008-00 印刷性包装材料管理规程
- 第四届长三角地区铁道行业职业技能竞赛(铁路桥隧工赛项)考试题库(含答案)
- 2024年湖南怀化市交通运输局所属事业单位招聘工作人员7人高频考题难、易错点模拟试题(共500题)附带答案详解
- 胖东来企业文化指导手册
- 盲人按摩医院(诊所)建设标准
- 高一英语完型填空10篇实战训练及答案
评论
0/150
提交评论