【问题标题】:Add specific capacity constraint on arcs for routing optimization with Or-Tools使用 Or-Tools 在弧上添加特定容量约束以进行路由优化
【发布时间】:2022-06-22 17:25:20
【问题描述】:

Or-Tools Routing 是否可以在弧上创建容量限制?

让我解释:

我已经实现了以下example

问题在于,在某些回合中,有些路线的卡车容量有限(例如,卡车的容量不得超过 6 个单位的桥梁)。

是否可以在两个节点 i 和 j 之间添加特定的容量约束,以便:

capacity(i) - capacity(j) <= allowed capacity between the two steps,如果是这样怎么办?

约束必须在弧上,我找不到使用 Java 的方法。


一个例子:

我有一辆载有 3 个单位的卡车一世,它必须指向j遇到一座桥,桥上允许的最大负载为 2 个单位。因此,它不能过桥。换句话说,这一轮必须以另一种方式进行。

非常感谢您提前

  • 链接似乎已损坏或未达到您的预期...
  • 感谢您的信息,我更新了问题(顺便提出了一个答案)

标签: java optimization routes or-tools


【解决方案1】:

如果可以帮助其他人,我会与您分享我的解决方案。

必须添加以下约束:减去步骤 j - 步骤 i 的负载(容量)的结果必须小于步骤 ij 允许的最大负载。

使用Java,我们得到以下代码:

容量矩阵:


long[][] maxLoad = {
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
                {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
            };

约束声明:


Solver solver = routing.solver();
RoutingDimension capacite_dim = routing.getDimensionOrDie("Capacity");

for (int i = 0; i < secteur.getMaxLoad().length; i++) {
  for (int j = 0; j < secteur.getMaxLoad()[0].length; j++) {
    //if there is a load constraint in matrix
    if (secteur.getMaxLoad()[i][j] >= 0) {
      long beforeIndex = manager.nodeToIndex(i);
      long afterIndex = manager.nodeToIndex(j);
      //add constraint
      solver.addConstraint(solver.makeLessOrEqual(solver.makeDifference(capacite_dim.cumulVar(afterIndex),capacite_dim.cumulVar(beforeIndex)),secteur.getMaxLoad()[i][j]));
    }
  }
}

该约束确保在两个步骤之间的弧上流动的负载小于该步骤的最大允许负载。

【讨论】:

    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多