【问题标题】:Definition of slack variable in time window routing时间窗口路由中松弛变量的定义
【发布时间】:2018-05-23 08:29:29
【问题描述】:

时间窗口约束由

定义

time_dimension.CumulVar(node).SetRange(time_window[0], time_window[1])

时间维度由

routing.AddDimension(evaluator, slack_max, capacity, fix_start_cumul_to_zero, name)

CumulVar(node)slack_max 的允许值有什么关系?例如,假设时间窗口为(50,60),而松弛时间为5。这是否意味着 45 的 cumul var 的值也是可接受的,或者松弛是否与范围内的值有关?在上面的示例中,max_slack=0 是否意味着 cumul var 的值必须是 5060

有没有关于or-tools的路由模型使用的数学模型的论文或详细页面?

【问题讨论】:

    标签: python-3.x or-tools


    【解决方案1】:

    对于时间窗口约束,您可以将松弛值视为等待时间。
    来自源代码。

    // 如果 j == next(i),
    // cumuls(j) = cumuls(i) + transits(i) + slacks(i)

    源代码:https://github.com/google/or-tools/blob/d44fb1b423f9d6658c142c041143a4f54b5106d3/ortools/constraint_solver/routing.h#L1356-L1357

    例如假设您在时间 0 也就是 A(0) 位于节点 A 并且您有 B([40,60]) 并且传输时间是 T(50)。因此,您有:
    B(40) < A(0) + T(50) -> 表示即使没有等待时间也无法到达下限。
    B(60) = A(0) + T(50) + 10 -> 表示车辆可以在节点 A 等待长达 10 分钟,但仍能及时到达节点 B。

    第二个例子:A(0), B([40,60]), T(30):
    B(40) = A(0) + T(30) + 10 -> 必须等待 10 分钟
    B(60) = A(0) + T(30) + 30 -> 必须等待 30 分钟
    如果 slack max 为 5,则禁止这条路线,因为否则车辆最多会在节点 B 处 35 = A(0) + T(30) + 5,这为时过早
    即不在[40,60] 范围内,因此对于求解器而言,时间窗口约束不能得到尊重...
    注意:我们也可以推导出:
    B(40) = A(5) + T(30) + 5
    B(60) = A(30) + T(30)
    因此,车辆必须在节点 A 处 [5,30] 范围内才能准时在节点 B 处 slack_max = 5
    即使用 slack max,您可以限制沿途允许的最长等待时间(额外容量)。

    路由使用“两步”算法。
    1)尝试找到可以使用各种算法的第一个解决方案 参看。 https://developers.google.com/optimization/routing/routing_options#first-solution-strategy-options论文参考
    2)可以使用本地搜索来优化第一个解决方案 再次实现了几种方法 cf https://developers.google.com/optimization/routing/routing_options#local-search-options

    【讨论】:

      猜你喜欢
      • 2016-01-11
      • 2023-01-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多