- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 Google 的 OR Tools python 库实现的有效车辆路由问题解决方案。我有一个包含 9 个位置的时间矩阵,以及每个位置的时间窗口。所有值均以 为单位秒 .
(例如,第一个时间窗口是从 28800 到 28800。28800 秒相当于上午 8:00。我希望这个位置,即 depot 正好在上午 8:00 被访问)
我故意只用一辆车来解决这个问题(基本上是解决一个旅行推销员问题)。我相信我已经正确添加了我的维度,但我当然可能犯了一个错误 - 我的意图是让车辆在任何位置等待,只要它愿意,只要它允许它解决问题车辆路径问题。我将上限最大值设置为 86400,因为一天有 86400 秒,我认为鉴于此数据,这将是一个足够高的数字。
来源
from ortools.constraint_solver import pywrapcp
from ortools.constraint_solver import routing_enums_pb2
Matrix = [
[0,557,763,1156,813,618,822,700,112], # Depot
[523,0,598,1107,934,607,658,535,589], # 1 - Location
[631,480,0,968,960,570,451,135,582], # 2 - Location
[1343,1247,1367,0,1270,1289,809,1193,1253], # 3 - Location
[746,1000,1135,1283,0,1003,1186,1071,776], # 4 - Location
[685,627,810,1227,990,0,712,709,550], # 5 - Location
[869,718,558,732,1105,650,0,384,821], # 6 - Location
[679,528,202,878,1008,618,412,0,630], # 7 - Location
[149,626,762,1124,696,532,821,698,0] # 8 - Location
]
Windows = [
[ 28800, 28800 ], # Depot
[ 43200, 43200 ], # 1 - Location
[ 50400, 50400 ], # 2 - Location
[ 21600, 79200 ], # 3 - Location
[ 21600, 79200 ], # 4 - Location
[ 21600, 79200 ], # 5 - Location
[ 21600, 79200 ], # 6 - Location
[ 21600, 79200 ], # 7 - Location
[ 21600, 79200 ] # 8 - Location
]
# Create the routing index manager.
manager = pywrapcp.RoutingIndexManager(len(Matrix), 1, 0)
# Create Routing Model.
routing = pywrapcp.RoutingModel(manager)
# Create and register a transit callback.
def time_callback(from_index, to_index):
# Returns the travel time between the two nodes.
# Convert from routing variable Index to time matrix NodeIndex.
from_node = manager.IndexToNode(from_index)
to_node = manager.IndexToNode(to_index)
return Matrix[from_node][to_node]
transit_callback_index = routing.RegisterTransitCallback(time_callback)
# Define cost of each arc.
routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)
# Add Time Windows constraint.
routing.AddDimension(
transit_callback_index,
86400, # An upper bound for slack (the wait times at the locations).
86400, # An upper bound for the total time over each vehicle's route.
False, # Determine whether the cumulative variable is set to zero at the start of the vehicle's route.
'Time')
time_dimension = routing.GetDimensionOrDie('Time')
# Add time window constraints for each location except depot.
for location_idx, time_window in enumerate(Windows):
if location_idx == 0:
continue
index = manager.NodeToIndex(location_idx)
time_dimension.CumulVar(index).SetRange(time_window[0], time_window[1])
# Add time window constraints for each vehicle start node.
index = routing.Start(0)
time_dimension.CumulVar(index).SetRange(Windows[0][0],Windows[0][1])
# Instantiate route start and end times to produce feasible times.
routing.AddVariableMinimizedByFinalizer(time_dimension.CumulVar(routing.Start(0)))
routing.AddVariableMinimizedByFinalizer(time_dimension.CumulVar(routing.End(0)))
# Setting first solution heuristic.
search_parameters = pywrapcp.DefaultRoutingSearchParameters()
search_parameters.first_solution_strategy = (routing_enums_pb2.FirstSolutionStrategy.PATH_CHEAPEST_ARC)
# Setting local search metaheuristics:
search_parameters.local_search_metaheuristic = (routing_enums_pb2.LocalSearchMetaheuristic.GUIDED_LOCAL_SEARCH)
search_parameters.time_limit.seconds = 5
search_parameters.log_search = False
# Solve the problem.
solution = routing.SolveWithParameters(search_parameters)
# Return the solution.
time = 0
index = routing.Start(0)
print("Locations:")
while not routing.IsEnd(index):
time = time_dimension.CumulVar(index)
print("{0} ({1}, {2})".format(manager.IndexToNode(index),solution.Min(time),solution.Max(time)))
index = solution.Value(routing.NextVar(index))
print("{0} ({1}, {2})".format(manager.IndexToNode(index),solution.Min(time),solution.Max(time)))
输出
Locations:
0 (28800, 28800)
8 (28912, 42041)
5 (29444, 42573)
1 (43200, 43200)
2 (50400, 50400)
7 (50535, 50535)
6 (50947, 50947)
3 (51679, 51679)
4 (52949, 52949)
0 (52949, 52949)
我的问题是关于解决方案为我计算的输出。我对解决方案中第二个和第三个位置的时间窗口感到困惑。我希望所有的时间窗口看起来都像结果的其余部分。
solution.Min()
做什么的和
solution.Max()
当我处理我的解决方案时,这个问题的范围内的值是什么意思?我在使用 OR 工具时是否有任何明显的错误?
最佳答案
Locations:
0 (28800, 28800) // must arrive and leave no later than 28800
8 (28912, 42041) // must arrive at or after 28912 and leave no later than 42041
5 (29444, 42573) // must arrive at or after 29444and leave no later than 42573
1 (43200, 43200) // must arrive and leave no later than 43200
2 (50400, 50400) // must arrive and leave no later than 50400
请参阅我添加的评论。当到达时间是一个范围时,比如节点 8 或 5,这基本上意味着到达时间需要落在该时间范围内。只要满足条件,该解决方案仍然可行。
Depot [28800, 28800] -> Travel (0, 8) 112-> Loc 8 [21600, 79200] -> Travel (8, 5) 532 -> Loc 5 [21600, 79200] -> Travel (5, 1) 685 -> Loc 1 [43200, 43200]
在时间 28800 出发,行程时间为 112,您将在时间 28912(解中的最小值)到达 loc 8,立即出发,行程时间为 532,您将在时间 29444 到达 loc 5。
loc 1
有一个可用的时隙,即
43200
.因此,如果车辆准时离开
29444
旅行时间为
627
它将到达
loc 1
在时间
30071
,这不是有效的到达时间。但如果车辆在
43200-627= 42573
出发它会准时到达。因此,这意味着车辆需要闲置(松弛)一段时间才能行驶。作为两者
loc 8
和
loc 5
有一个范围,解决方案表明这些位置有一些可用的余量。因此,最小值和最大值真正告诉您的是,只要到达和离开在这些范围内,解决方案就是可行的。
关于python - 如何解释从 Google OR Tools 返回的 Vehicle Routing Problem 解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63161785/
我很绝望,现在已经两天(!!)天都没有解决方案来解决以下问题。 更新 Lion 后,我想使用最新版本的 rvm 安装额外的 rubies。 这是我之后调用 bundler 时发生的情况: /Users
我的问题: ajax 调用的无限循环会产生问题吗? 假设有这样的代码: ajaxcall(); function ajaxcall(){ jQuery.ajax({ typ
这是一个有趣的小项目,我已经开始尝试并最大限度地提高赢得办公室曲棍球池的机会。我试图找到最好的方法来选择 20 名能够在最高工资帽内给我最多分数的球员。 例如,假设原始数据由 玩家姓名 位置(前锋,后
我有一个总数为540000的数字列表。我想将此列表分为3个列表,每个列表总共180000。最有效的编程方法是这样做,假设数字列表是一个平面文件,每个数字为线? 最佳答案 听起来像Knapsack pr
抱歉,也许因为我不是英语,我不知道,但我找不到解决几个问题的任何资源;也许我用的词不正确.. 我想了解有关 iPhone 4 和 5 不同分辨率的更多信息。 首先:如果我开发针对 iPhone 4 分
在全局配置缓存后,如 docs ,如果我在 app.module 之外使用 CacheInterceptor,它会抛出错误。 app.module.ts const cacheConfig = {
我无法让 g:each 工作。我正在尝试遍历任何内容,但它永远不起作用 = 不生成任何 html。 索引.gsp Item ${i.name} 用户 Controller .g
在我的 XAML 文件中,我有一个这样声明的 ListBox:
想知道你是否可以帮助我: 我有一个名为initializeAll的方法: public final void initializeAll() { //other stuff........ rand
我尝试过使用 XML 和 JAVA 在我的 Android Activity 中创建一个 ImageView。这两次,我都能够获取我一天前创建的所有其他 PNG 资源以显示在 ImageView 中。
我需要你的帮助。这是什么意思? Warning: mysql_query() [function.mysql-query]: Access denied for user 'ODBC'
这是一段代码 function test() { this.value = "foo"; } $(document).ready(function () { test();
这是一些非常基础的东西。渲染期间引发异常:java.util.Locale.toLanguageTag()Ljava/lang/String; XML: 问题似乎出在 Edit
除其他来源外,我还使用 Stackoverflow 上的各种帖子,尝试实现我自己的 PHP 分类器,以将推文分类为正面、中性和负面类别。在编码之前,我需要弄清楚流程。我的思路和例子如下:
在过去的几周里,每当我在 Eclipse 上使用 SVN 插件时,我都会收到以下错误: Certificate Problem There is a problem with the site's s
我被拒绝运行以下功能(位于 /var/www/mysite/public_html/app/Controllers/Script.php) $structure = '/var/www/mysite/
我正在使用 ctags 为我的 Emacs 创建标签以使用 cygwin 从中读取符号。 Emacs 说 “访问标签表缓冲区:文件/home/superman/tags 不是有效的标签表” 这是我查找
我知道作为一种函数式语言,XSL 没有像传统的 for 循环(而是 for-each)那样的东西。 我正在尝试从可变数量的元素开始创建一个具有固定数量 (7) 的表。总之,我有
我正在使用RavenDB进行一些测试,以基于iphone应用程序存储数据。该应用程序将发送一个带有GPS key 的5个GPS坐标的字符串。我在RavenDB中看到每个文档约为664-668字节。这是
我无法理解我的应用程序的行为。我想创建一个简单的窗口 (1000x700px),分为两部分(分别为 250px 和 750px 宽度)。我尝试了以下代码: import java.awt.Color;
我是一名优秀的程序员,十分优秀!