Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Google或Tools中指定路由的结束位置?_Python_Python 3.x_Or Tools_Vehicle Routing - Fatal编程技术网

Python 如何在Google或Tools中指定路由的结束位置?

Python 如何在Google或Tools中指定路由的结束位置?,python,python-3.x,or-tools,vehicle-routing,Python,Python 3.x,Or Tools,Vehicle Routing,我有一个工作车辆路径问题的解决方案,使用谷歌的或Python工具实现。我有一个包含16个位置的时间矩阵,每个位置的时间窗口,以及删除每个位置的惩罚。所有值均以秒为单位。我故意用一辆车来解决这个问题(本质上是解决一个旅行推销员的问题)。我允许车辆在任何位置等待所需的时间。我已经为一些地点设定了极高的扣分,因为我不希望他们被扣分 时间矩阵中表示的每个位置都有一个时间窗口,表示从一天开始的时间(28800相当于上午8:00,64800相当于下午6:00,等等)。我将上限最大值设置为64800,因为我希

我有一个工作车辆路径问题的解决方案,使用谷歌的或Python工具实现。我有一个包含16个位置的时间矩阵,每个位置的时间窗口,以及删除每个位置的惩罚。所有值均以秒为单位。我故意用一辆车来解决这个问题(本质上是解决一个旅行推销员的问题)。我允许车辆在任何位置等待所需的时间。我已经为一些地点设定了极高的扣分,因为我不希望他们被扣分

时间矩阵中表示的每个位置都有一个时间窗口,表示从一天开始的时间(28800相当于上午8:00,64800相当于下午6:00,等等)。我将上限最大值设置为64800,因为我希望车辆在下午6:00前完成

我已将矩阵中的第一个位置指定为起始位置。
现在,我希望矩阵中的第二个位置是结束位置。

我已经参考了这方面的经验,但没有发现成功。我还发现了关于堆栈溢出的帖子,但没有找到任何特别有用的回复

下面是我的源代码-它成功运行,但使用矩阵中的第二个位置作为它创建的解决方案的结束位置

来源

来自ortools.constraint\u解算器导入pywrapcp
从ortools.constraint\u解算器导入路由\u枚举\u pb2
矩阵=[
[0, 0, 550, 743, 790, 606, 810, 684, 1500, 101, 1001, 722, 533, 574, 1126, 713],
[0, 0, 550, 743, 790, 606, 810, 684, 1500, 101, 1001, 722, 533, 574, 1126, 713],
[530, 530, 0, 609, 953, 620, 676, 550, 1544, 598, 875, 443, 489, 737, 1114, 914],
[622, 622, 475, 0, 962, 570, 453, 144, 1695, 585, 1073, 641, 738, 745, 966, 922],
[760, 760, 1014, 1147, 0, 1018, 1208, 1088, 1029, 780, 1375, 1180, 976, 609, 1293, 450],
[629, 629, 621, 716, 989, 0, 715, 706, 1654, 516, 1219, 787, 734, 728, 1247, 650],
[867, 867, 720, 567, 1109, 653, 0, 392, 1330, 830, 1318, 886, 983, 990, 731, 1092],
[671, 671, 524, 213, 1011, 619, 395, 0, 1724, 634, 1122, 690, 788, 795, 867, 971],
[1372, 1372, 1549, 1758, 1030, 1593, 1358, 1731, 0, 1392, 1987, 1714, 1588, 1221, 1443, 1101],
[132, 132, 615, 764, 688, 545, 830, 704, 1398, 0, 990, 787, 547, 472, 1126, 612],
[930, 930, 960, 1198, 1318, 1209, 1265, 1138, 2028, 1031, 0, 526, 866, 1078, 1703, 1272],
[759, 759, 549, 786, 1130, 797, 853, 727, 1721, 718, 556, 0, 579, 914, 1291, 1091],
[437, 437, 541, 836, 887, 764, 902, 776, 1597, 538, 877, 576, 0, 671, 1340, 811],
[621, 621, 880, 1013, 486, 926, 1079, 953, 1196, 640, 1005, 1046, 837, 0, 1259, 441],
[1608, 1608, 1517, 1654, 1547, 1562, 1088, 1480, 1610, 1484, 2115, 1683, 1794, 1556, 0, 1436],
[515, 515, 769, 902, 373, 773, 969, 842, 1078, 534, 1130, 935, 731, 364, 1140, 0]
]
Windows=[[2880028800]、[6480064800]、[4320043200]、[5040050400]、[2160079200]、[2160079200]、[2160079200]、[2160079200]、[2160079200]、[2160079200]、[2160079200]、[2160079200]、[2160079200]、[2160079200]、[2160079200]、[2160079200]、[2160079200]、[2160079200]]
持续时间=[0,0,1800,3600,3600,7200,1800,1800,1800,1800,1800,1800,1800,1800,1800,1800]
罚款=[100000,100000,576460752303423487,576460752303423487,100000,100000,100000,100000,100000,100000,100000,100000,100000,100000]
#创建路由索引管理器。
manager=pywrapcp.RoutingIndexManager(len(矩阵),1,0)
#创建路由模型。
路由=pywrapcp.RoutingModel(管理器)
#创建并注册中转回调。
def transit_回调(从_索引到_索引):
#返回两个节点之间的移动时间。
#将路由变量索引转换为时间矩阵节点索引。
from_node=manager.IndexToNode(from_index)
to_node=manager.IndexToNode(to_index)
返回矩阵[从\u节点][到\u节点]+持续时间[从\u节点]
transit\u callback\u index=routing.RegisterTransitCallback(transit\u callback)
#定义每个弧的成本。
路线。所有车辆的SetArcCostEvaluatorofall Vehicles(运输回收索引)
#添加时间窗口约束。
routing.AddDimension(
运输指数,
64800,#松弛的上限(位置处的等待时间)。
64800,#每辆车路线上总时间的上限。
错误,#确定累积变量是否在车辆路线开始时设置为零。
"时间")
time\u dimension=routing.getdimensionOrde('time'))
#允许删除节点。
对于范围(1,len(矩阵))中的节点:
routing.addDisconction([manager.NodeToIndex(node)],惩罚[node])
#为除车辆段外的每个位置添加时间窗口约束。
对于位置\u idx,枚举(窗口)中的时间\u窗口:
如果位置_idx==0:
持续
index=manager.NodeToIndex(位置_idx)
时间维度.CumulVar(index).SetRange(时间窗口[0],时间窗口[1])
#为每个车辆启动节点添加时间窗口约束。
索引=路由。开始(0)
时间维度.CumulVar(index).SetRange(窗口[0][0],窗口[0][1])
#实例化路线开始和结束时间,以生成可行时间。
routing.AddVariableMinimizedByFinalizer(time\u dimension.CumulVar(routing.Start(0)))
routing.AddVariableMinimizedByFinalizer(time\u dimension.CumulVar(routing.End(0)))
#设置第一个解决方案启发式。
search_parameters=pywrapcp.DefaultRoutingSearchParameters()
搜索\参数。第一个\解决方案\策略=(路由\枚举\ pb2.第一个解决方案策略。路径\最便宜的\弧)
#设置本地搜索元启发式:
search_parameters.local_search_metahestival=(路由_enums_pb2.localsearchmetahestival.GUIDED_local_search)
搜索参数。时间限制。秒=5
search\u parameters.log\u search=False
#解决问题。
解决方案=路由。SolveWithParameters(搜索参数)
结果={
“已删除”:无,
“时间表”:无
}
#显示丢弃的节点。
删除=[]
用于范围内的节点(
{'Dropped': [4, 5], 'Schedule': [[0, 28800, 28800], [9, 28901, 29249], [13, 31173, 31521], [15, 33414, 33762], [8, 36292, 36640], [14, 39535, 39883], [2, 43200, 43200], [6, 45676, 46195], [7, 47868, 48387], [3, 50400, 50400], [11, 54641, 57541], [10, 56997, 59897], [12, 59663, 62563], [1, 64800, 64800], [0, 64800, 64800]]}
WARNING: Logging before InitGoogleLogging() is written to STDERR
F0820 15:13:16.748222 62401984 routing.cc:1433] Check failed: kUnassigned != indices[i] (-1 vs. -1) 
*** Check failure stack trace: ***