How to Build a Model – 2(如何构建一个模型-2)

  本文档描述了如何利用SimpleModel类创建一个Repast模型。从代码上来看这样的模型更复杂,但是可以汲取模型所有的优点。本文档的目的是为了那些建立拥有Reppast功能的模型的用户或者有写基于agent仿真经验的人。如果没有实践经验的其他人请参考如何创建一个Repast模型-1

注意:这篇文档最好结合仿真例子一起读。

OverView

  利用Repast仿真类型可以分为两大类:批处理运行和非批处理运行。批处里仿真通过读取一个特殊格式化参数的文件来完成,这个文件详细的说明乐模型开始参数与结束参数,以及怎样增加这些参数和运行model的个数。然后仿真就开始执行而无须人工干预。

非批处里的运行需要用户通过图形用户接口来启动和停止,允许用户图形化方式设置启动参数。另外非批处理仿真允许用户在运行过程中以图形化的显示和操作(例如监测)一个agent和模型的状态。

接下来就介绍下实现这两种仿真的基础,特别注意对于一个模型的参数文件中的初始化参数设置、用户图形化的设置初始化参数和允许监测发生所必须做的。

The Agent

  批处里和非批处里仿真大体上相相似。不管是哪种处理方式,一个通过Repast实现的典型仿真至少包含两个用户实现的类,agenet类和model类(请看样本仿真详细实例的源码)。Agent类在很大程度上通过GameAgent接口和Game抽象类来模拟特定的实体,Repast为交互式代理提供最基本的支持。如果agent想要显示,它需要实现Drawable接口(更多信息请看 )。如果用户想要监测一个agent,也就是说想要图象化的方式显示控制agents的状态,agent必须用访问器方法模式去编码实现。

The Model

一个模型,比如SugarModel.java或者EnnModel.java(in repast/demos/sugarscape/src/src/uchicago/src/sim/sugarScape and repastdemos/enn/src/src/uchicago/src/sim/enn respectively) 都建立和控制着Repast仿真的显示和基础结构。所有Repast仿真模型必须实现SimModel接口。Repast提供了一个抽象类SimModelImpl,它实现了部分接口,方便大部分类去扩展它。

假设用户通过写自己的model来扩展SimModelImpl,典型的model类需要包含以下部分

Infrastructure and Representation 变量

  典型model类包含的变量即既是infrastructure 和 representational 类型。Infrastrusture 变量就像一个时间表,是agent等的集合类。例如,SugarModel.java有一个Schedule变量和显示agent和agent环境的DisplaySurface变量。representation变量的最大一部分就是模型运行的初始化参数。例如,SugarModel包含一个numAgents变量,它是用来配置仿真模型中sugar agent的数量。

任何继承了SimModelImpl的模型也继承了rngSeed变量,这个变量能通过getRngSeed 和 setRngSeed来访问。

Repast Template Methods

  这些模板方法尽管不是SimModel接口必须的,将基础结构和关键性步骤设置过程划分成连贯的组。所以,不必须但是鼓励用户用这些方法来构建他们的模型。

  1)private void buildModel()

  buildModel()方法的职责是创建仿真建模所展示的部分。这部分是模型细节。不过agent和它们的环境联合任何的可选数据集合对象通常在这个方法里创建。当然,这个方法可能调用其它的方法来建模。SugarModel在buildModel()中用初始化参数构建了所有的Sugar Agents和Sugar Space。建立和收集数据的更多信息请看How To Collect Data

  2)private void buildDisplay()

  buildDisplay()方法创建了仿真中那些必须显示给用户的仿真部分。批处理模型可能没有这个方法。SugarModel在方法里为agent建立的display类和graphing类。但是DisplaySurface对象的实际创建应该发生在setup()方法中。创建displays的更多信息请看How To Create Displays,创建charts更多信息请看How to Create Charts

  3)private void buildSchedule()

  buildSchedule()方法创建了Schedule,负责改变仿真的状态。这就意味着schedule指明什么时候什么对象上调用什么方法。更多信息请看How to Use a Schedule。所有的示例模型的源码提供了很好的例子,Schedule API文档应该是按时间一直向前的。

Get and Set Accessor Methods

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxdwp.html