需求生成与分配

在交通流仿真中,需求生成与分配是至关重要的步骤,它决定了仿真系统的初始状态和动态变化。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");

    }

}

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐