python-3.x - 时间窗路由中slack变量的定义

标签 python-3.x or-tools

时间窗口约束定义为
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 的累积变量的值?也是可以接受的,或者松弛是否与范围内的值有关?是否max_slack=0意味着 cumul var 的值必须是 5060 ,在上面的例子中?

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

最佳答案

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

// if 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,又名 A(0)你有 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 分钟
如果松弛最大值是 5这条路线是禁止的,否则车辆最多会在节点 B 处 35 = A(0) + T(30) + 5太早了
即不在 [40,60] 范围内所以对于求解器来说,时间窗口约束不能得到尊重......
注意:我们还可以推导出:B(40) = A(5) + T(30) + 5B(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

关于python-3.x - 时间窗路由中slack变量的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50483447/

相关文章:

python - OR-Tools:获取每一个最优解

python - 使用 OR 工具在 python 中进行约束优化 : How to enforce a multi level constraint?

c# - 或者工具 Sat 示例在 C# 表单应用程序中不起作用

python - 需要使用 python 根据其标题提取内容

python - 有条件地删除 Pandas Dataframe 行

python-3.x - 重新索引系列会在 Pandas 中返回 NaN

python - 在 webhook 的头像上上传本地镜像时出现错误 '_io.BufferedReader' 对象没有属性 'startswith'

python-3.x - 字符串缓冲区无法将数据写入数据库表

从 Python 包中调用时,Python OR-tools 函数不起作用

找不到 Python 模块错误 "No module named ' ortools'“