[Matsim]Matsim学习笔记-drt场景中车辆调度的学习

2024-08-21 23:04

本文主要是介绍[Matsim]Matsim学习笔记-drt场景中车辆调度的学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习需求

在用matsim实现交通流模拟drt场景时,遇到这样一个问题:车辆接送完乘客后,在没有新的订单之前,车辆一直停在最后一个停靠点上,这样车辆的利用率会较低,想实现一个送完最后一个乘客后,车辆能回到某个点上,在回到某个点的过程中响应新的订单?

调研目的

学习matsim在drt场景中是如何实现车辆的调度、任务的添加、更新以及调度状态的更新的?

调研笔记

1、车辆调度初始化

// 初始化车辆调度(初始时给车辆创建了一个StayTask任务)
DrtTaskFactory taskFactory = new DrtTaskFactoryImpl();
for (DvrpVehicle veh : fleet.getVehicles().values()) {veh.getSchedule().addTask(taskFactory.createStayTask(veh, veh.getServiceBeginTime(),veh.getServiceEndTime(), veh.getStartLink()));
}

可以发现车辆初始化时是创建了一个StayTask任务,添加到车辆调度任务列表中
2、调度中添加任务

//调度默认状态,添加新任务后变为PLANNED
private ScheduleStatus status = ScheduleStatus.UNPLANNED;
public void addTask(int taskIdx, Task task) {validateArgsBeforeAddingTask(taskIdx, task);if (status == ScheduleStatus.UNPLANNED) {status = ScheduleStatus.PLANNED;}AbstractTask t = (AbstractTask)task;tasks.add(taskIdx, t);t.taskIdx = taskIdx;t.status = TaskStatus.PLANNED;// update idx of the existing tasksfor (int i = taskIdx + 1; i < tasks.size(); i++) {tasks.get(i).taskIdx = i;}
}
这段Java代码是一个addTask方法的实现,是用于向某个任务计划中添加任务。以下是该方法的步骤和逻辑:参数验证:在添加任务之前,调用validateArgsBeforeAddingTask(taskIdx, task)方法来验证传入的参数是否有效。状态检查与更新:检查当前计划的状态(status)。如果状态是ScheduleStatus.UNPLANNED,则将其更新为ScheduleStatus.PLANNED。类型转换:将传入的task参数强制转换为AbstractTask类型。这表明task应该是AbstractTask的实例或其子类的实例。添加任务:将转换后的任务t插入到tasks列表的指定位置taskIdx。这里假设tasks是一个支持按索引添加元素的列表(如ArrayList)。设置任务索引:为新添加的任务t设置其索引taskIdx。设置任务状态:将新添加的任务状态设置为TaskStatus.PLANNED。更新现有任务索引:遍历tasks列表中taskIdx之后的所有任务,并将它们的索引设置为它们在列表中的位置。这是为了保持任务索引的连续性和正确性。这段代码假设了几个重要的类和枚举类型:AbstractTask:一个抽象类,实现了Task接口。
TaskStatus:一个枚举,表示任务的状态,enum TaskStatus {PLANNED, STARTED, PERFORMED}
ScheduleStatus:一个枚举,表示计划的状态,enum ScheduleStatus {UNPLANNED, PLANNED, STARTED, COMPLETED
}
tasks:一个列表,用于存储任务集合。

3、matsim中的任务类型
有三种任务:Stay、Drive、Stop

public class DrtTaskFactoryImpl implements DrtTaskFactory {@Overridepublic DrtDriveTask createDriveTask(DvrpVehicle vehicle, VrpPathWithTravelData path, DrtTaskType taskType) {return new DrtDriveTask(path, taskType);}@Overridepublic DrtStopTask createStopTask(DvrpVehicle vehicle, double beginTime, double endTime, Link link) {return new DefaultDrtStopTask(beginTime, endTime, link);}@Overridepublic DrtStayTask createStayTask(DvrpVehicle vehicle, double beginTime, double endTime, Link link) {return new DrtStayTask(beginTime, endTime, link);}
}

4、创建行驶任务

  • 使用taskFactory.createDriveTask方法创建一个新的行驶任务(DrtDriveTask)。这个方法需要车辆对象(vehicleEntry.vehicle)、路径数据(vrpPath)和任务类型(DrtDriveTask.TYPE)。
    下面为创建从停留或者停车任务的link到乘客请求的出发link的行驶任务,并添加到调度任务列表中
//根据起始link和结束link、路径、旅行时间创建vrpPath
VrpPathWithTravelData vrpPath = VrpPaths.createPath(stayOrStopTask.getLink(), request.getFromLink(),stayOrStopTask.getEndTime(), detourData.detourToPickup, travelTime);
//根据车辆、vrpPath、任务类型创建行驶任务
beforePickupTask = taskFactory.createDriveTask(vehicleEntry.vehicle, vrpPath, DrtDriveTask.TYPE);
//添加行驶任务到调度任务列表中
schedule.addTask(stayOrStopTask.getTaskIdx() + 1, beforePickupTask);

5、创建上客停车任务
使用taskFactory.createStopTask方法创建一个新的DrtStopTask上客停车任务。传入车辆、开始时间、计算出的停留时间与请求的最早开始时间中的较大者、以及上客点的link。

DrtStopTask pickupStopTask = taskFactory.createStopTask(vehicleEntry.vehicle, startTime,Math.max(startTime + stopDuration, request.getEarliestStartTime()), request.getFromLink());
schedule.addTask(taskIdx, pickupStopTask);

这篇关于[Matsim]Matsim学习笔记-drt场景中车辆调度的学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094532

相关文章

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o