[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线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

Nginx内置变量应用场景分析

《Nginx内置变量应用场景分析》Nginx内置变量速查表,涵盖请求URI、客户端信息、服务器信息、文件路径、响应与性能等类别,这篇文章给大家介绍Nginx内置变量应用场景分析,感兴趣的朋友跟随小编一... 目录1. Nginx 内置变量速查表2. 核心变量详解与应用场景3. 实际应用举例4. 注意事项Ng

Java中接口和抽象类的异同以及具体的使用场景

《Java中接口和抽象类的异同以及具体的使用场景》文章主要介绍了Java中接口(Interface)和抽象类(AbstractClass)的区别和联系,包括相同点和不同点,以及它们在实际开发中的具体使... 目录一、接口和抽象类的 “相同点”二、接口和抽象类的 “核心区别”关键区别详解(避免踩坑)三、具体使

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess

99%的人都选错了! 路由器WiFi双频合一还是分开好的专业解析与适用场景探讨

《99%的人都选错了!路由器WiFi双频合一还是分开好的专业解析与适用场景探讨》关于双频路由器的“双频合一”与“分开使用”两种模式,用户往往存在诸多疑问,本文将从多个维度深入探讨这两种模式的优缺点,... 在如今“没有WiFi就等于与世隔绝”的时代,越来越多家庭、办公室都开始配置双频无线路由器。但你有没有注

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.