[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

相关文章

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景