微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ORTools 添加对访问节点的约束

如何解决ORTools 添加对访问节点的约束

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

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

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

B -> A -> C

A -> B

D -> E

A -> D

B -> E

请注意,没有解决方案包含 C -> [D|E]

如何在 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。