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

devtools/2024/12/22 16:19:30/

学习需求

在用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);

http://www.ppmy.cn/devtools/99057.html

相关文章

【最经典的79个】软件测试面试题(内含答案)

001.软件的生命周期(prdctrm) 计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运行与维护(running maintrnacne) 测试用例 用例编号 测试项目 测试标题 重要级别 预置条件 输入数据 执行步骤 预期结果 0002.问&…

VBA技术资料MF185:图片导入Word添加不同格式说明文字

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

探索TensorFlow:深度学习的未来

标题&#xff1a;探索TensorFlow&#xff1a;深度学习的未来 在当今快速发展的人工智能领域&#xff0c;TensorFlow无疑是最耀眼的明珠之一。TensorFlow是由Google Brain团队开发的一个开源机器学习框架&#xff0c;它以其强大的灵活性、易用性和高效的性能&#xff0c;迅速成…

【速览】计算机网络(更新中)

目录 一、背景二、优缺点三、适用场景四、核心组成分层结构TCP/UDP区别TCP三次握手、四次挥手 HTTP/HTTPS区别无状态长连接、短连接 状态码Cookie和SeesionURI和URL 五、底层原理六、对比参考 一、背景 这个技术出现的背景、初衷和要达到什么样的目标或是要解决什么样的问题。这…

加速指南:如何使用Kimi提升论文写作效率?

在学术研究领域&#xff0c;撰写论文是一项基础且关键的任务&#xff0c;它要求作者不仅要有扎实的专业知识&#xff0c;还要具备高效的信息处理能力和清晰的表达技巧。学术写作是一个复杂的过程&#xff0c;涉及多个阶段&#xff1a;从选题、资料搜集、论文结构设计&#xff0…

Vue3自定义hooks

1. 什么是自定义hooks&#xff1f; 以函数形式抽离一些可复用的方法像钩子一样挂着&#xff0c;随时可以引入和调用&#xff0c;实现高内聚低耦合的目标。 高内聚&#xff1a;指一个模块内部的功能应该尽可能相关&#xff0c;模块内的元素应紧密合作&#xff0c;完成单一且明确…

Java、python、php版的高考志愿填报辅助系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

Objective-C 中的定时神器:NSTimer 的高效使用指南

标题&#xff1a;Objective-C 中的定时神器&#xff1a;NSTimer 的高效使用指南 在Objective-C编程中&#xff0c;NSTimer是一个强大的工具&#xff0c;用于执行定时任务。无论是需要周期性执行的操作&#xff0c;还是简单的时间延迟&#xff0c;NSTimer都能轻松应对。本文将深…