【问题标题】:Google OR-Tools: Total Time Capacity over All Routes CombinedGoogle OR-Tools:所有路线组合的总时间容量
【发布时间】:2021-08-11 23:54:14
【问题描述】:

在 Google OR-Tools Java 中,如何为所有路由组合设置维度容量?

我的用例是所有路线的总持续时间——整个车队只能有 X 小时的行程。我在网上看到了有关如何为所有车辆单独设置跨度成本系数、软上限或容量的文档。如何为所有车辆设置一个硬性上限?

下面的代码不是正确的解决方案,因为它单独设置了所有路线的容量:

router.addDimension(transitCallbackIndex, 0, totalSecondsForAnIndividualRoute, true, "Time");

【问题讨论】:

    标签: java python or-tools operations-research


    【解决方案1】:

    基本上你需要使用底层求解器并添加一个约束

    “所有车辆端节点的cumulVar之和小于你的硬限制”

    基于https://github.com/google/or-tools/blob/stable/ortools/constraint_solver/samples/VrpGlobalSpan.java的Java示例

    import java.util.ArrayList; // import the ArrayList class
    import com.google.ortools.constraintsolver.Solver;
    import com.google.ortools.constraintsolver.IntVar;
    ...
      // Constraint sum of all distance to be <= 5500
      Solver solver = routing.solver();
      ArrayList<IntVar> ends = new ArrayList<>();
      for( int i=0; i < manager.getNumberOfVehicles(); ++i) {
        long index = routing.end(i);
        IntVar tmp = distanceDimension.cumulVar(index);
        ends.add(tmp);
      }
      IntVar[] vars = ends.toArray(new IntVar[0]);
      solver.addConstraint(solver.makeSumLessOrEqual(vars, 5500));
    

    【讨论】:

    • 谢谢,Mizux。效果很好。给其他人的注意事项:[1] 有了这个更重的约束,我需要 ALL_UNPERFORMED 作为FirstSolutionsStrategy. [2] 在实现这一点时,我首先通过在同一维度上设置 distanceDimension.setSpanCostCoefficientForAllVehicles 来破坏代码。这会改变 distanceDimension.cumulVar() 的缩放比例。
    猜你喜欢
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2021-07-28
    • 2022-06-30
    • 1970-01-01
    相关资源
    最近更新 更多