学习需求:
在交通模拟中,默认的路网中link的速度是不随时间发生变化,在实际的交通流中,高峰期和平峰期的link的速度是不同的,甚至,在不同的时间段,速度也不相同,因此需要实现link的速度随时间段进行更新,带着这个需求,开始继续学习matsim…
调研笔记
调研matsim幸运的发现,matsim的已经实现了这个需求,在matsim中支持三种模式的时变路网更新,时变路网支持三种变化模式:在指定的时间段内以指定的速度替换、以设置的速度乘以系数、以设置速度加减数据偏移量三种方式
public enum ChangeType {
/**
* 绝对值替换
*/
ABSOLUTE_IN_SI_UNITS,
/**
* 系数
*/
FACTOR,
/**
* 偏移量
*/
OFFSET_IN_SI_UNITS
}
通过创建NetworkChangeEvent对象实现交通模拟中道路的容量、自由流速度或者车道数的变更。
flowCapacityChange: 可能用于表示流量容量的变化。
freespeedChange: 可能用于表示自由流速度的变化,即在没有交通拥堵的情况下道路的最大速度。
lanesChange: 可能用于表示车道数的变化。
下面记录一下实现时变路网的配置文件设置
在config.xml中找到network的配置
<module name="network">
<param name="inputNetworkFile" value="./src/main/resources/pt/pt_network.xml" />
<param name="inputChangeEventsFile" value="./src/main/resources/pt/networkChangeEvents.xml" />
<param name="timeVariantNetwork" value="true" />
module>
其中:
inputNetworkFile表示交通模拟用的路网文件
要实现时变路网,主要是用到了这两个配置
<param name="inputChangeEventsFile" value="./src/main/resources/pt/networkChangeEvents.xml" />
<param name="timeVariantNetwork" value="true" />
两个条件必须都设置,也可以在代码中设置时变路网
Config config = ConfigUtils.loadConfig(configFilename);
config.network().setTimeVariantNetwork(true);
config.network().setChangeEventsInputFile("");
下面是如何生成networkChangeEvents.xml文件,看一下示例文件
<networkChangeEvents xmlns="http://www.matsim.org/files/dtd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.matsim.org/files/dtd http://www.matsim.org/files/dtd/networkChangeEvents.xsd">
<networkChangeEvent startTime="07:00:00">
<link refId="53385"/>
<link refId="101220"/>
<link refId="101223"/>
<freespeed type="absolute" value="25.0"/>
networkChangeEvent>
<networkChangeEvent startTime="12:00:00">
<link refId="53385"/>
<link refId="101220"/>
<link refId="101223"/>
<freespeed type="scaleFactor" value="1.2"/>
networkChangeEvent>
<networkChangeEvent startTime="15:00:00">
<link refId="53385"/>
<link refId="101220"/>
<link refId="101223"/>
<freespeed type="offset" value="5"/>
networkChangeEvent>
networkChangeEvents>
根据示例文件,需要生成多个networkChangeEvent,属性有startTime,link,freespeed,其中startTime表示从这个时间点开始,对应refId(link在路网network.xml中的id)的link的速度用
给点的模式进行替换。
下面是一个生成networkChangeEvent.xml的示例代码,这里都是用的第一种模式绝对值替换
//输入数据:两个数组的长度要一致
String[] timeRange = {"06:00","07:00","09:00","17:00","19:00","22:00"};
double[] speedValue = {20,13,20,13,20,25};//单位km/h,需要转化成m/s
fileName =""//这里是生成xml文件的路径
List<NetworkChangeEvent> changeEvents = new ArrayList<>();
for (int i = 0; i < timeRange.length; i++) {
NetworkChangeEvent changeEvent = new NetworkChangeEvent(Time.parseTime(timeRange[i]));
changeEvent.setFreespeedChange(new NetworkChangeEvent.ChangeValue(NetworkChangeEvent.ChangeType.ABSOLUTE_IN_SI_UNITS, speedValue[i]/3.6));
changeEvent.addLinks(linklist);
changeEvents.add(changeEvent);
}
new NetworkChangeEventsWriter().write(fileName, changeEvents);
至此,就实现了时变路网配置文件的生成
待解决问题
在代码中是如何实现了时变路网的加载和属性的更新呢?学习了再继续更新