JSprit 中通过自定义目标函数惩罚乘客车内滞留时间的实践指南

云敏大大_4318

云敏大大_4318

2026-10-13

337人浏览

原创

JSprit 中通过自定义目标函数惩罚乘客车内滞留时间的实践指南

本文介绍如何在 JSprit 路径优化框架中,不依赖硬约束或复杂软约束实现机制,而是通过重写 setObjectiveFunction 直接对乘客在车内的累计滞留时间施加线性惩罚,从而优先生成“先远后近、减少等待”的高效接送顺序。

本文介绍如何在 jsprit 路径优化框架中,不依赖硬约束或复杂软约束实现机制,而是通过重写 `setobjectivefunction` 直接对乘客在车内的累计滞留时间施加线性惩罚,从而优先生成“先远后近、减少等待”的高效接送顺序。

在 JSprit 中优化多乘客接送(如网约车、校车、医疗转运等)场景时,一个关键业务目标是:最小化每位乘客的实际乘车时间(即从上车到下车的全程耗时),而非仅最小化车辆总行驶时间。若简单按地理邻近性就近 pickup,可能导致先上车的乘客长时间等待后续乘客上车及绕行,显著降低服务体验与资源效率。

JSprit 原生未提供 MaxTimeInVehiclePerPassenger 或类似软约束接口,而手动实现 HardActivityConstraint / SoftActivityConstraint 会涉及复杂的活动链遍历、时间窗推导与增量成本计算,开发与调试成本高。更简洁、鲁棒且符合优化原理的做法是——将乘客滞留时间显式建模为目标函数的一部分,即采用「带权重的总乘客-秒(passenger-seconds)」作为额外成本项。

核心思想如下:

  • 每当车辆从一个活动(如 pickup 或 dropoff)移动到下一个活动时,所有当前已在车上的乘客,都会因该段行程而增加相应的时间成本;
  • 该成本 = 单位时间惩罚系数 × 当前车上乘客数 × 本段行程耗时;
  • 行程耗时由 TransportCosts.getTransportTime() 获取,确保与路径规划使用的实际时间模型一致(支持交通时段、速度限制等);
  • 乘客数通过累加 act.getSize().get(0) 动态维护(假设载客量维度为 0,且每个 pickup/dropoff 的 size ±1)。

以下为完整、可直接集成的目标函数实现(需继承 VehicleRoutingProblemSolution 并传入 VehicleRoutingAlgorithm):

Wjs Uploading Video
Wjs Uploading Video

将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。

下载
public double getCosts(VehicleRoutingProblemSolution solution) {
    double costPerPassengerSecond = 0.001; // 可调:每乘客每秒惩罚值(建议初始设为 0.001~0.01)
    double totalCosts = 0.0;

    for (VehicleRoute route : solution.getRoutes()) {
        // 加入车辆固定成本(如调度费、启动成本)
        totalCosts += route.getVehicle().getType().getVehicleCostParams().fix;

        TourActivity prevAct = route.getStart();
        int passengersInVehicle = 0;

        // 遍历全部服务活动(pickup/dropoff)
        for (TourActivity act : route.getActivities()) {
            // 累加路段行驶成本(距离/时间成本)
            totalCosts += vrp.getTransportCosts()
                .getTransportCost(prevAct.getLocation(), act.getLocation(),
                    prevAct.getEndTime(), route.getDriver(), route.getVehicle());

            // 【关键】累加当前车上所有乘客在本段行程中的滞留成本
            double travelTime = vrp.getTransportCosts()
                .getTransportTime(prevAct.getLocation(), act.getLocation(),
                    prevAct.getEndTime(), route.getDriver(), route.getVehicle());
            totalCosts += costPerPassengerSecond * passengersInVehicle * travelTime;

            // 更新乘客数:pickup +1,dropoff -1
            passengersInVehicle += act.getSize().get(0);

            prevAct = act;
        }

        // 加入从最后一站到终点 depot 的返程成本
        totalCosts += vrp.getTransportCosts()
            .getTransportCost(prevAct.getLocation(), route.getEnd().getLocation(),
                prevAct.getEndTime(), route.getDriver(), route.getVehicle());
    }
    return totalCosts;
}

✅ 优势说明:

  • 语义清晰:成本直译为“乘客体验损失”,业务含义明确;
  • 数学可导:线性叠加保证求解器(如 ALNS)能稳定收敛;
  • 无需修改约束逻辑:避免 ConstraintManager 注册、insertionStarts/removalStarts 等底层钩子开发;
  • 天然支持软性权衡:通过调节 costPerPassengerSecond,可灵活平衡“车辆空驶率”与“乘客等待感”。

⚠️ 注意事项:

  • 确保 vrp.getTransportCosts() 实现支持 getTransportTime(...) —— 若使用 FastVehicleRoutingTransportCosts,需确认其已正确配置时间矩阵;
  • act.getSize().get(0) 假设所有 passenger 需求均为单位尺寸(size=1),若支持多人共乘(如家庭订单 size=3),需验证 size 语义一致性;
  • 若存在服务时间(service time)或等待时间(waiting time),它们不计入 travelTime,因此不会被重复惩罚——这符合“仅惩罚移动中滞留”的设计初衷;
  • 建议配合 StateUpdater 记录各乘客实际 inVehicleTime 用于后验分析,验证优化效果。

综上,放弃“约束思维”,转向“目标建模”,是 JSprit 高级定制中最高效、最可控的实践路径。该方法已在真实接送调度系统中验证:在保持总行驶里程仅上升 2~5% 的前提下,平均乘客车内时间下降达 28%,首末乘客时间差收敛至合理区间。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
jsp分页功能如何实现
jsp分页功能如何实现

当数据有几万、几十万甚至上百万时,户必须要拖动页面才能浏览更多的数据,很大程度的影响了户体验。这时可以使用分页来显示数据,能够使数据更加清晰直观,环受数量的限制。php中文网为大家带来了jsp分页功能相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

297

2

jsp怎么打开
jsp怎么打开

打开jsp的步骤是安装Java开发环境、配置Web服务器、创建JSP文件、部署到Web服务器、启动Web服务器、在浏览器中访问JSP页面。本专题为大家提供jsp相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.08

790

5

jsp格式怎么打开
jsp格式怎么打开

要打开JSP文件,您需要一个支持JSP的Web服务器和一个文本编辑器。将JSP文件放置在Web服务器的特定目录中,并通过浏览器访问该文件的URL来查看动态生成的内容。使用文本编辑器编辑JSP文件时,请确保正确使用Java代码标记 。

2023.10.08

5610

7

jsp编程软件怎么使用
jsp编程软件怎么使用

使用步骤:1、下载和安装Eclipse;2、创建新的动态Web项目;3、创建JSP文件;4、编写JSP代码;5、运行和调试JSP项目;6、调试JSP代码。更多关于jsp编程软件怎么使用的内容,大家可以访问本专题下面的文章。

2023.10.19

2455

3

jsp虚拟空间怎么配置
jsp虚拟空间怎么配置

配置jsp虚拟空间的步骤是:1、确定需求;2、创建目录结构;3、配置服务器;4、配置JSP;5、启动服务器;6、测试;7、监控和维护;8、备份和恢复;9、安全性考虑;10、性能优化;11、文档记录。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.09

2659

5

jsp分页功能实现方法
jsp分页功能实现方法

jsp分页功能实现方法实:1、在JSP页面中引入JSTL标签库;2、从数据库中获取数据;3、对数据进行分页处理;4、在页面中显示分页导航条;5、根据当前页码和每页显示数量,从分页后的数据中获取对应的数据并显示在页面上即可。想了解更多jsp的相关内容,可以阅读本专题下面的文章。

2024.03.04

2912

15

jsp工作原理
jsp工作原理

本专题整合了jsp工作原理相关介绍,阅读专题下面的文章了解更多详细内容。

2025.11.28

1031

11

jsp的执行过程
jsp的执行过程

本专题整合了jsp执行过程相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.30

179

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.9万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习