[Matsim]Matsim学习笔记-时变路段的创建

学习需求:
在交通模拟中,默认的路网中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);

至此,就实现了时变路网配置文件的生成
待解决问题
在代码中是如何实现了时变路网的加载和属性的更新呢?学习了再继续更新

你可能感兴趣的:(matsim,#+,matsim,学习,matsim)