文章目录
本文翻译并提炼自官方文档
MASON的核心模拟代码在sim.engine
包中,该包主要包含以下类:
sim.engine.SimState
:保存Agent模型的全局对象。sim.engine.Schedule
:离散事件调度队列(Scheduling Queue)。sim.engine.Stepable
:由Agent实现的接口,step方法将作为Schedule的任务。- 其他工具类。
SimState模拟实体,Schedule模拟时间,而fields模拟空间和Agent之间的关系。fields相关类不在sim.engine
中,而在以下包中:
sim.field.grid
:保存二维或三维网格。sim.field.continuous
:保存连续的二维或三维网格数据。sim.field.network
:保存图形和网络。
(一)模型
启动主程序需要创建一个sim.engine.SimState
的子类,模拟所需的所有元素将组合在此类中。包括模型参数、自定义类型数据等,可以作为SimState
子类的一个成员变量保存。
由于模型中的所有数据最终都存储在SimState
子类的某个成员变量上,MASON可以将整个模型序列化为checkpoint文件,这意味着可以随时冻结模拟将其全部保存到文件中,并可以从此文件重新启动模型。为了实现这一点,所有MASON模型对象都实现了java.io.Serializable
,这意味着它们可以写入流或从流中读取。
SimState
已经包含了以下两个成员变量:
public MersenneTwisterFast random;
public Schedule schedule;
random
是采用Mersenne Twister算法实现的随机数快速生成器。与java.util.Random
的伪随机数不同,这是一个高质量的随机数生成器(尽管MersenneTwisterFast
也是伪随机数生成器)。
MersenneTrusterFast
不是线程同步的。通常MASON模拟是单线程的,也就没有问题。但如果模拟被分解为多个线程,需要确以线程安全的方式访问random
,示例代码如下: