【问题标题】:OR Tools limit visits between two nodes或工具限制两个节点之间的访问
【发布时间】:2021-12-09 09:54:39
【问题描述】:

例如,假设我有这样的事情:

solver().Add(this.solver.ActiveVar(start) == this.solver.ActiveVar(end));

针对特定路线。这意味着开始索引必须在结束索引上结束。 如果我想限制这期间可能发生的访问次数怎么办?

例如,如果限制为 2,则只有具有类似内容的解决方案才有效

start-> n1 -> n2 -> end
start -> n1 -> end
start -> end

通常我会尝试一些涉及车辆限制的事情,但在这种情况下,一辆车可以有多个起点和终点

【问题讨论】:

    标签: python c# or-tools traveling-salesman


    【解决方案1】:

    几件事:

    1.

    solver().Add(this.solver.ActiveVar(start) == this.solver.ActiveVar(end));
    

    只是意味着这两个位置必须是活动的(即已访问)或未访问的(又名0)(即是析取的一部分)。

    1. 如何创建一个计数器维度然后限制两个节点之间的差异? 在 Python 中应该或多或少:
    routing.AddConstantDimension(
    1, # increase by one at each visit
    42, # max count
    True, # Force Start at zero
    'Counter')
    counter_dim = routing.GetDimensionOrDie('Counter')
    
    start = manager.NodeToIndex(start_node)
    end = manager.NodeToIndex(end_node)
    
    solver = routing.solver()
    
    # start must be visited at most two nodes before end node
    solver.Add(count_dim.CumulVar(start) + 3 >= count_dim.CumulVar(end))
    
    # start must be visited before end
    solver.Add(count_dim.CumulVar(start) <= count_dim.CumulVar(end))
    
    1. 不要让您的“车辆多次启动”,每辆车只有一次启动。节点....

    【讨论】:

    • 多个起点意味着一辆车,但节点布局类似于 start1->n1->n2->n3->End1->start2->n4->n5->n6->End2->startN ...EndN 但是我认为这个解决方案也适用于这种情况。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多