Jsprit结果获取:除VRPXMLWriter输出XML外如何存储变量?
关于Jsprit直接获取计算结果的方法
嘿,你完全没搞错方向——jsprit绝对提供了直接从计算结果里提取数据并存储到变量的API,根本不用绕XML解析这道麻烦的弯!
其实Jsprit的Solution对象就是所有计算结果的核心载体,你说的类似bestSolution.getAllVehicles()的功能,早就通过一系列API实现了,只是可能你一开始没留意到这些核心类的用法:
- 获取所有车辆的配送路线:调用
bestSolution.getRoutes()会返回一个Collection<Route>集合,每个Route对象对应一辆车的完整任务执行路径。 - 获取单辆车的任务详情:从
Route对象里,你可以用route.getVehicle()直接拿到对应的车辆实例,再通过route.getActivities()获取该车辆的所有任务活动(包括起点、取货、送货、终点等)。 - 获取未分配的任务:如果有任务没被分配到任何车辆,
bestSolution.getUnassignedJobs()会返回这些任务的集合。
举个实际的代码示例,帮你快速上手:
// 假设你已经通过算法求解得到了最优解Solution bestSolution // 1. 获取所有车辆的路线集合 Collection<Route> allRoutes = bestSolution.getRoutes(); // 遍历每一条路线,提取车辆和任务信息 for (Route route : allRoutes) { Vehicle currentVehicle = route.getVehicle(); System.out.println("当前车辆ID: " + currentVehicle.getId()); // 获取该车辆的所有任务活动 List<Activity> activities = route.getActivities(); for (Activity activity : activities) { // 根据活动类型区分处理,比如取货/送货任务 if (activity instanceof ShipmentActivity) { ShipmentActivity shipmentAct = (ShipmentActivity) activity; System.out.println(" 关联任务ID: " + shipmentAct.getShipment().getId()); System.out.println(" 活动类型: " + shipmentAct.getType()); System.out.println(" 任务位置ID: " + shipmentAct.getLocation().getId()); } // 还可以处理起点(Start)、终点(End)等基础活动 else if (activity instanceof Start) { System.out.println(" 出发地: " + ((Start) activity).getLocation().getId()); } } } // 2. 检查是否有未分配的任务 Collection<Job> unassignedJobs = bestSolution.getUnassignedJobs(); if (!unassignedJobs.isEmpty()) { System.out.println("\n未被分配的任务ID列表:"); for (Job job : unassignedJobs) { System.out.println(" " + job.getId()); } }
至于你疑惑为什么Jsprit不提供getAllVehicles()这类方法——其实getRoutes()已经间接实现了这个需求:你只需要遍历所有Route,就能拿到所有参与配送的车辆。而且这种设计更合理,因为它把车辆和对应的任务路线绑定在一起,方便你直接关联分析。
之前用XML解析混乱的问题,大概率是因为XML输出更多是用于可视化或者和其他系统交互的场景,并非获取结果的首选方式。直接操作Solution、Route这些核心类才是Jsprit推荐的用法~
内容的提问来源于stack exchange,提问作者Mattieu Kevin
相关产品推荐
相关产品推荐

