【问题标题】:ORTools add constraint on visited nodesORTools 对访问节点添加约束
【发布时间】:2021-03-23 16:16:22
【问题描述】:

我想知道是否可以使用 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。

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

【问题讨论】:

    标签: python or-tools


    【解决方案1】:

    你试过了吗:

    # 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

    【讨论】:

    • 谢谢@Mizux,昨晚我刚刚想出了解决方案,但您的回答证实了我的想法,谢谢!我不知道第二种解决方案,我会在不久的将来尝试!
    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2021-09-10
    • 2016-02-16
    相关资源
    最近更新 更多