介观交通流仿真软件:MATSim (Multi-Agent Transport Simulation)_(11).需求生成与分配
本节将详细介绍如何在 MATSim 中生成和分配交通需求,包括数据准备、需求生成和需求分配的具体步骤和代码示例。在开始需求生成与分配之前,需要准备一些基础数据,这些数据通常包括网络数据、人口数据和活动数据。随机生成是一种简单的需求生成方法,它通过随机生成个体和他们的出行计划来模拟交通需求。MATSim 提供了多种需求生成方法,包括随机生成、OD矩阵生成和基于人口调查数据生成。活动数据描述了居民的日
需求生成与分配
在交通流仿真中,需求生成与分配是至关重要的步骤,它决定了仿真系统的初始状态和动态变化。MATSim 提供了多种方法来生成和分配交通需求,这些方法可以根据不同的仿真需求进行选择和配置。本节将详细介绍如何在 MATSim 中生成和分配交通需求,包括数据准备、需求生成和需求分配的具体步骤和代码示例。
1. 数据准备
在开始需求生成与分配之前,需要准备一些基础数据,这些数据通常包括网络数据、人口数据和活动数据。MATSim 使用 XML 格式的数据文件,通过这些文件可以定义网络结构、人口分布和活动时间表。
1.1 网络数据
网络数据是交通仿真的基础,它描述了道路网络的结构和属性。网络数据文件通常包含以下信息:
-
节点(Nodes):道路网络的交汇点。
-
链路(Links):连接节点的道路段。
-
路段时间(Travel Times):链路的通行时间。
-
容量(Capacities):链路的最大通行能力。
示例代码:以下是一个简单的网络数据文件 network.xml 的示例:
<?xml version="1.0" encoding="UTF-8"?>
<network>
<nodes>
<node id="0" x="0.0" y="0.0"/>
<node id="1" x="1000.0" y="0.0"/>
<node id="2" x="1000.0" y="1000.0"/>
<node id="3" x="0.0" y="1000.0"/>
</nodes>
<links>
<link id="0-1" from="0" to="1" length="1000.0" freespeed="13.89" capacity="1000.0"/>
<link id="1-2" from="1" to="2" length="1000.0" freespeed="13.89" capacity="1000.0"/>
<link id="2-3" from="2" to="3" length="1000.0" freespeed="13.89" capacity="1000.0"/>
<link id="3-0" from="3" to="0" length="1000.0" freespeed="13.89" capacity="1000.0"/>
</links>
</network>
1.2 人口数据
人口数据描述了仿真区域内的居民及其出行需求。人口数据文件通常包含以下信息:
-
个体(Agents):每个居民的信息。
-
活动(Activities):居民的日常活动,包括时间、地点和类型。
-
出行计划(Plans):居民的出行路线和时间表。
示例代码:以下是一个简单的人口数据文件 population.xml 的示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE population SYSTEM "http://www.matsim.org/files/dtd/population_v6.dtd">
<population>
<person id="1">
<plan score="1.0" selected="yes">
<activity type="home" link="0-1" x="0.0" y="0.0" end_time="07:00:00"/>
<leg mode="car">
<route type="links" start_link="0-1" end_link="1-2" trav_time="00:30:00">0-1 1-2</route>
</leg>
<activity type="work" link="1-2" x="1000.0" y="1000.0" end_time="17:00:00"/>
<leg mode="car">
<route type="links" start_link="1-2" end_link="2-3" trav_time="00:30:00">1-2 2-3</route>
</leg>
<activity type="home" link="2-3" x="0.0" y="1000.0" end_time="18:00:00"/>
</plan>
</person>
<person id="2">
<plan score="1.0" selected="yes">
<activity type="home" link="2-3" x="1000.0" y="1000.0" end_time="08:00:00"/>
<leg mode="car">
<route type="links" start_link="2-3" end_link="3-0" trav_time="00:30:00">2-3 3-0</route>
</leg>
<activity type="work" link="3-0" x="0.0" y="0.0" end_time="16:00:00"/>
<leg mode="car">
<route type="links" start_link="3-0" end_link="0-1" trav_time="00:30:00">3-0 0-1</route>
</leg>
<activity type="home" link="0-1" x="1000.0" y="0.0" end_time="18:00:00"/>
</plan>
</person>
</population>
1.3 活动数据
活动数据描述了居民的日常活动,这些活动可以是家庭活动、工作活动、购物活动等。活动数据文件通常包含活动的类型、地点和时间。
示例代码:以下是一个简单的活动数据文件 activities.xml 的示例:
<?xml version="1.0" encoding="UTF-8"?>
<activityTypes>
<activityType id="home" duration="14400.0"/>
<activityType id="work" duration="36000.0"/>
<activityType id="shopping" duration="7200.0"/>
</activityTypes>
2. 需求生成
需求生成是根据基础数据生成交通需求的过程。MATSim 提供了多种需求生成方法,包括随机生成、OD矩阵生成和基于人口调查数据生成。
2.1 随机生成
随机生成是一种简单的需求生成方法,它通过随机生成个体和他们的出行计划来模拟交通需求。随机生成的参数包括个体数量、出行时间分布、出行模式分布等。
示例代码:以下是一个随机生成需求的 Java 代码示例:
import org.matsim.api.core.v01.Scenario;
import org.matsim.api.core.v01.TransportMode;
import org.matsim.core.config.Config;
import org.matsim.core.config.ConfigUtils;
import org.matsim.core.population.PopulationUtils;
import org.matsim.core.populationactivities.ActivityTypes;
import org.matsim.core.scenario.ScenarioUtils;
import org.matsim.core.utils.collections.RandomLinkSelector;
import org.matsim.core.utils.gis.Point2D;
import org.matsim.core.utils.geometry.CoordUtils;
import org.matsim.core.utils.geometry.CoordinateTransformation;
import org.matsim.core.utils.geometry.transformations.TransformationFactory;
import org.matsim.core.utils.misc.Time;
import java.io.File;
import java.util.Random;
public class RandomDemandGenerator {
public static void main(String[] args) {
// 创建配置
Config config = ConfigUtils.createConfig();
config.network().setInputFile("network.xml");
config.plans().setInputFile("population.xml");
config.facilities().setInputFile("activities.xml");
// 创建场景
Scenario scenario = ScenarioUtils.loadScenario(config);
// 创建随机数生成器
Random random = new Random();
// 定义活动类型
ActivityTypes activityTypes = new ActivityTypesImpl();
activityTypes.addActivityType(new ActivityTypeImpl("home", 14400.0));
activityTypes.addActivityType(new ActivityTypeImpl("work", 36000.0));
// 定义活动设施
ActivityFacilities facilities = ActivityFacilitiesUtils.createActivityFacilities();
facilities.addActivityFacility(new ActivityFacilityImpl.Builder()
.setId("home1")
.setCoord(new Point2D(0.0, 0.0))
.build());
facilities.addActivityFacility(new ActivityFacilityImpl.Builder()
.setId("work1")
.setCoord(new Point2D(1000.0, 1000.0))
.build());
// 定义出行模式
String[] modes = {TransportMode.car, TransportMode.pt, TransportMode.bike};
// 生成随机需求
for (int i = 0; i < 100; i++) {
// 创建个体
Person person = PopulationUtils.getFactory().createPerson(Id.create(i, Person.class));
// 定义出行计划
Plan plan = PopulationUtils.createPlan(person);
// 定义家庭活动
Activity homeActivity = PopulationUtils.createActivityFromFacility("home", facilities.getActivityFacilityById("home1"));
homeActivity.setEndTime(Time.toSeconds("07:00:00"));
// 定义出行腿
Leg leg = PopulationUtils.createLeg(TransportMode.car);
leg.setDepartureTime(Time.toSeconds("07:00:00"));
leg.setRoute(PopulationUtils.createLinkNetworkRouteImpl("0-1 1-2"));
// 定义工作活动
Activity workActivity = PopulationUtils.createActivityFromFacility("work", facilities.getActivityFacilityById("work1"));
workActivity.setEndTime(Time.toSeconds("17:00:00"));
// 添加活动和出行腿到计划
plan.addActivity(homeActivity);
plan.addLeg(leg);
plan.addActivity(workActivity);
// 添加计划到个体
person.addPlan(plan);
// 添加个体到场景
scenario.getPopulation().addPerson(person);
}
// 保存场景
new PopulationWriter(scenario.getPopulation(), scenario.getNetwork()).write("random_population.xml");
}
}
2.2 OD矩阵生成
OD矩阵生成是一种基于起讫点(Origin-Destination, OD)数据的需求生成方法。OD矩阵描述了从一个区域到另一个区域的出行需求量。通过OD矩阵,可以更精确地模拟交通需求,特别是在城市交通仿真中非常有用。
示例代码:以下是一个基于 OD 矩阵生成需求的 Java 代码示例:
import org.matsim.api.core.v01.Id;
import org.matsim.api.core.v01.network.Link;
import org.matsim.api.core.v01.population.Person;
import org.matsim.api.core.v01.population.Plan;
import org.matsim.api.core.v01.population.Population;
import org.matsim.api.core.v01.population.PopulationFactory;
import org.matsim.api.core.v01.population.Route;
import org.matsim.core.config.ConfigUtils;
import org.matsim.core.population.PopulationUtils;
import org.matsim.core.population.routes.LinkNetworkRouteFactory;
import org.matsim.core.population.routes.NetworkRoute;
import org.matsim.core.scenario.ScenarioUtils;
import org.matsim.core.utils.misc.Time;
import org.matsim.core.facilities.ActivityFacility;
import org.matsim.core.facilities.ActivityFacilityImpl;
import org.matsim.core.facilities.ActivityFacilityUtils;
import org.matsim.core.facilities.ActivityOption;
import org.matsim.core.facilities.ActivityOptionImpl;
import org.matsim.core.facilities.ActivityOptionUtils;
import org.matsim.core.facilities.ActivityTypes;
import org.matsim.core.facilities.ActivityTypesImpl;
import org.matsim.core.facilities.io.ActivityFacilitiesReader;
import org.matsim.core.facilities.io.ActivityFacilitiesWriter;
import org.matsim.core.network.io.NetworkReaderMatsimV4;
import org.matsim.core.network.io.NetworkWriter;
import org.matsim.core.population.io.PopulationWriter;
import org.matsim.core.population.io.PopulationReader;
import java.io.File;
import java.util.Random;
public class ODDemandGenerator {
public static void main(String[] args) {
// 创建配置
Config config = ConfigUtils.createConfig();
config.network().setInputFile("network.xml");
config.plans().setInputFile("population.xml");
config.facilities().setInputFile("activities.xml");
// 创建场景
Scenario scenario = ScenarioUtils.loadScenario(config);
// 读取网络数据
Network network = scenario.getNetwork();
new NetworkReaderMatsimV4(scenario.getNetwork()).readFile("network.xml");
// 读取活动设施数据
ActivityFacilities facilities = scenario.getActivityFacilities();
new ActivityFacilitiesReader(scenario).readFile("activities.xml");
// 定义出行模式
String[] modes = {TransportMode.car, TransportMode.pt, TransportMode.bike};
// 生成OD矩阵需求
for (int i = 0; i < 100; i++) {
// 创建个体
Person person = PopulationUtils.getFactory().createPerson(Id.create(i, Person.class));
// 选择出发和目的地活动设施
ActivityFacility originFacility = facilities.getActivityFacilityById("home1");
ActivityFacility destinationFacility = facilities.getActivityFacilityById("work1");
// 定义家庭活动
Activity homeActivity = PopulationUtils.createActivityFromFacility("home", originFacility);
homeActivity.setEndTime(Time.toSeconds("07:00:00"));
// 定义出行腿
Leg leg = PopulationUtils.createLeg(TransportMode.car);
leg.setDepartureTime(Time.toSeconds("07:00:00"));
// 计算出行路线
Link startLink = network.getLinks().get(Id.create("0-1", Link.class));
Link endLink = network.getLinks().get(Id.create("1-2", Link.class));
NetworkRoute route = new LinkNetworkRouteFactory().createRoute(startLink, endLink);
leg.setRoute(route);
// 定义工作活动
Activity workActivity = PopulationUtils.createActivityFromFacility("work", destinationFacility);
workActivity.setEndTime(Time.toSeconds("17:00:00"));
// 创建出行计划
Plan plan = PopulationUtils.createPlan(person);
plan.addActivity(homeActivity);
plan.addLeg(leg);
plan.addActivity(workActivity);
// 添加计划到个体
person.addPlan(plan);
// 添加个体到场景
scenario.getPopulation().addPerson(person);
}
// 保存场景
new PopulationWriter(scenario.getPopulation(), scenario.getNetwork()).write("od_population.xml");
}
}

更多推荐


所有评论(0)