ORTools为访问的节点添加约束



我想知道是否可以使用ORTools VRTWs问题为不同的路线设置旅行限制。

例如,如果我有一个节点列表
a、B、C、D、E
其中C不能用D和E路由。

因此,可能的路线是(仅举几个例子(:

B->A->C

A->B

D->E

A->D

B->E

注意,没有任何解决方案包含C->

如何在ORTools中对此类约束进行建模?有可能吗?

一些解决方案建议设置具有节点约束的车辆,例如一半车辆包含C,一半车辆包含D和E。

它是有效的,但它会生成次优解,因为车辆数量是固定的,约束节点的数量将大于可能的路线数量,从而导致次优解。

你尝试过吗:

# C != D
active_c_d = routing.ActiveVar(c) * routing.ActiveVar(d)
routing.solver().Add(
active_c_d * (routing.VehicleVar(c) - routing.VehicleVar(d)) != (1 - active_c_d))
# C != E
active_c_e = routing.ActiveVar(c) * routing.ActiveVar(e)
routing.solver().Add(
active_c_e * (routing.VehicleVar(c) - routing.VehicleVar(e)) != (1 - active_c_e))

示例:https://gist.github.com/Mizux/9e37c370a459bd472a6ac13c304f0b54

否则,您也可以使用Solver::MakeAllDifferent()(未测试(进行测试

routing.solver().AllDifferent([routing.VehicleVar(c), routing.VehicleVar(d)])
routing.solver().AllDifferent([routing.VehicleVar(c), routing.VehicleVar(e)])

参考:https://github.com/google/or-tools/blob/fa84bc05e72641dddfbb98164d81b8bc9bef6ea5/ortools/constraint_solver/constraint_solver.h#L1500-L1513

最新更新