讲师中心 微信公众号
AI工具推荐 视频效率加速

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

云敏大大_4318

云敏大大_4318

发布时间:2026-10-13 23:18:10

|

337人浏览过

|

来源于php中文网

原创

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%,首末乘客时间差收敛至合理区间。

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

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

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

297

2023.06.21

jsp怎么打开
jsp怎么打开

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

810

2023.10.08

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

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

5630

2023.10.08

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

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

2475

2023.10.19

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

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

2659

2023.11.09

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

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

2912

2024.03.04

jsp工作原理
jsp工作原理

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

1031

2025.11.28

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

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

179

2025.11.30

VibeKnow知识视频制作与导出详解
VibeKnow知识视频制作与导出详解

本专题整理VibeKnow从注册、素材上传、AI生成到预览导出的完整操作,帮助新手快速制作第一条知识讲解视频。

0

2026.10.14

热门下载

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

精品课程

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

共101课时 | 20.9万人学习

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

共39课时 | 4.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn