首页 > 解决方案 > or-tools中节点的条件赋值

问题描述

因此,我正在处理一个问题,即我有某些类型的服务节点,只有在满足条件时才应该分配这些节点。在我的情况下,旅行的长度应该超过 x 小时。

这是一般方法

val cumulVarAtVehicleStartNode: IntVar = journeyDurationsDimension.cumulVar(routingIndexManager.getStartIndex(vehicleId))
val tourDurationMaxVar: IntVar = journeyDurationsDimension.cumulVar(routingIndexManager.getEndIndex(vehicleId))
val tourDurationVar = solver.makeDifference(tourDurationMaxVar, cumulVarAtVehicleStartNode).`var`()

// nodes can be unassigned
routingModel.addDisjunction(listOf(orToolsIndexForServiceNode).toLongArray(), 0)

val isServiceNodeActiveVar = routingModel.activeVar(orToolsIndexForServiceNode)

val tresholdInHours = 5
val isTourLongerThanThresholdVar = ourDurationVar.isGreaterOrEqual(tresholdInHours * 60 * 60)

val solver = routingModel.solver()
solver.addConstraint(
  solver.makeEquality(
     isTourLongerThanThresholdVar,
     isServiceNodeActiveVar
  )
)

此实现无法分配长于阈值的游览。我怀疑这是因为当求解器分配超过阈值的取货和交付对时,由于服务节点处于非活动状态,该解决方案被拒绝。并且不知何故,服务节点永远不会被分配,以满足旅行持续时间的条件。这里增加的复杂性是服务节点与车辆相关联。因此它们只能分配给单个车辆。

对于这样一个不是取货或交付对但在其他方面与其他节点相同的节点进行有条件分配的适当方法是什么?

标签: optimizationor-toolsvehicle-routing

解决方案


推荐阅读