在本章中,您将了解通过提供的功能,去扩展和定制MATSim的可能性。第45章描述了如何将自己的扩展连接到MATSim。
image.png
3.1 MATSim 模块化
MATSim遵循一个模块化的概念,但是“模块”不是一个具体术语;
因此,模块可以在软件框架中的许多层次上存在。同样在MATSim中,一系列不同的功能类型,(例如配置选项集、重新规划组件、贡献,甚至外部工具)有时被描述为模块。尝试去理解源自一般模块化体系结构的不同访问级别,变得尤其重要。
3.1.1 访问级别
MATSim目前提供五个访问级别,在下面的五个部分中进行了描述。
3.1.1.1 通过GUI,调用配置文件、道路和人口,使用MATSim
如果仅需使用核心,需要执行以下操作(参见第2.1节):
- 通过以下链接下载MATSim版本:http://matsim。
- 获取网络文件和初始计划文件。小样本数据可以手工输入;大数据量应该通过某种计算方法自动生成。
- 编写或编辑配置文件。
- 单击MATSim jar文件
- 按照说明进行操作
我们认为MATSim核心已经相当强大;例如,通过算法合成的代理人已经遵循完整的每日计划,具有完整的每日评分功能;因此,可以观察模型内的活动开放时间、出发时间选择和时间表延迟。
3.1.1.2 通过GUI和外部文件,使用MATSim
通过提供附加文件并相应地设置配置开关,可以从GUI使用一些附加功能。最重要的是,这涉及到除汽车(第7章)和基于时间表的公共交通(第16章)以外的,其他交通工具的显式模拟。
3.1.1.3 编写“Java脚本”
如果使用MATSim 发行版还不够,那么当前推荐的方法是学习如何编写MATSim“Java脚本”。这意味着使用Java作为MATSim的脚本语言;有关讨论,请参阅第3.1.2节。语法大致如下:
···
...main(...){
//construct the config object:
Config config=ConfigUtils.xxx(...);
config.xxx().setYyy(...);
...
//load and adapt the scenario object:
Scenario scenario=ScenarioUtils.loadScenario(config);
scenario.getXxx().doYyy(...);//()
...
//load and adapt the controler object:
Controler controler=new Controler(scenario);
controler.doZzz(...);//()
...
//run the iterations:
controler.run();
}
···
有关工作示例,请参见https://github.com/matsim-org/matsim-example-project;这也将包含一个有效的pom.xml文件,它将通过Maven引入所有库依赖项,包括MATSim本身。 扩展点,特别是在()和(**),在第45章中有更详细的描述。这部分需要Java和IDE经验。
java中的MATSim脚本示例可以在 https://github.com/matsim-org/matsim 找到代码示例。
注意,不同的分支,对应于不同的MATSim版本。
部分代码片段:
···
Config config;
if(args==null || args.length==0||args[0]==null){
config=ConfigUtils.loadConfig("scenarios/equil/config.xml");
}else{
config=ConfigUtils.loadConfig(args);
}
config.controler().setOverwriteFileSetting(
OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists);
···
3.1.14 使用Contribs或外部扩展
有一些MATSim扩展不是主发行版的一部分。它们有两种风格:
- 属于MATSim存储库contrib部分的扩展。
- 基于MATSim存储库之外的扩展。
MATSim扩展列在http://matsim.org/extensions。
外部扩展往往更独立于MATSim主分布。这可能是更独立的任务(如输入生成或输出分析/可视化)或更独立的API设计的结果。
对于contrib和外部扩展,都需要阅读自己的文档以获取有关其用法的信息。此类文件可通过http://matsim.org/extensions或http://matsim.org/javadoc.
MATSim核心团队再次建议从https://github.com/matsim-org/matsim使用contrib或外部扩展的示例项目,因为这两种类型的扩展都可以通过将它们添加到pom.xml文件让Maven做依赖管理。
显然,这再次意味着需要有一些Java和IDE经验。
例如:otfVIS 大致如下
···
...main(...){
Config config=ConfigUtils.xxx(...);
Scenario scenario=ScenarioUtils.loadScenario(config);
Controler controler=newControler(scenario);
controler.addOverridingModule(newOTFVisLiveModule());
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
controler.run();
}
···
上述代码可以打开otfvis,一个直接连接到每个mobsim运行的交互式可视化工具。
3.1.1.5 编写自己的扩展
如果现有的扩展不足以满足您的需求,那么下一个选择就是编写您自己的扩展。同样,我们建议从https://github.com/matsim-org/matsim示例项目。此外,还应使用第45章中描述的扩展点,因为这是扩展成为贡献的唯一方式。
3.1.2 如此运转背后的理念
正如上面所描述的,这种设置源于思路:不断增长的单个MATSim扩展最终可能使得MATSim团队及其核心开发人员团队难以专心于特定功能。因此,寻求一种方式,使他们能够专注于中央基础设施,而具体的功能,如道路定价、多模式模拟、信号、额外的选择维度或分析模块,可以是由社区撰写和贡献。显然,插件体系结构是较为合理的解决方案,但要使扩展插件具有足够的能力和健壮性需要时间和精力。
同时,MATSim是一个研究平台;研究调查创新性问题,这通常意味着在设计代码时很可能预见不到这些问题。通常,直接编写脚本语言是此类问题的解决方案;例如,QGIS,VISUM(Verkehr in Städten–UMlegung)、EMME(equireme Multimodal Multimodal equirement)或SUMO(Simulation of Urban Mobility)(通过TraCI接口)允许使用Python制作插件。MATSim团队曾经讨论过Scala语言(SCAlable LAnguage),但最终决定只使用Java本身作为脚本语言,这样做的好处是开发和MATSim应用程序之间的用户不需要学习两种语言。
此外,TU(Technische Universität)Berlin团队可以继续教授Java作为MATSim的入门和一般专业技能。
3.2 现有MATSim功能概述
图3.1显示了通用MATSim模块与MATSim循环的位置关系。一些模块有一个连接点(显示在循环周围,连接到相应的循环元素),而其他模块有多个连接点(显示在圆的中间),还有一些模块在全局范围内工作(显示在左上角和下角)。
MATSim functionality
模块使用的技术细节,特别是参数集,在http://matsim.org网站,尤其是http://matsim.org/javadoc以及http://matsim.org/extensions。
由于开源性、项目导向和论文导向的MATSim贡献过程(见第44章),模块通常是为特定的实际目的而实现的,这导致了各自模块的局限性。例如,模块可能只适用于特定模式,或者适用于已定义的调用顺序。通常,需要额外的工作来概括模块。因此,将特定模块与其他功能结合起来通常不是一项直接的任务。这意味着用户在有效地应用任何特定的模块组合之前,都必须对其进行系统的测试。
该图表内所示的分类,会在第4章和以下各章节中进行描述。
表格3.1 Matsim功能概述
功能概述
网友评论