Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.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
Optimization 或执行中的VRP解算器工具_Optimization_Traveling Salesman_Or Tools - Fatal编程技术网

Optimization 或执行中的VRP解算器工具

Optimization 或执行中的VRP解算器工具,optimization,traveling-salesman,or-tools,Optimization,Traveling Salesman,Or Tools,我试图测试或工具路由求解器来解决基本的TSP问题,但我一直无法使它正常工作。我有一个距离矩阵和一堆贪婪的解决方案,在问题被发送到路由求解器之前已经生成了。例如,我使用底部共享的示例python代码设置了一个问题 在这个例子中,我有10个城市的不对称距离矩阵。最佳贪婪解(从不同城市开始的最近的第一个)作为初始解存储在数据中。我有两个函数:solve\u from\u initial\u route()和solve\u from\u scratch(),它们可以解决相同的问题,无论是否有初始解决方案

我试图测试或工具路由求解器来解决基本的TSP问题,但我一直无法使它正常工作。我有一个距离矩阵和一堆贪婪的解决方案,在问题被发送到路由求解器之前已经生成了。例如,我使用底部共享的示例python代码设置了一个问题

在这个例子中,我有10个城市的不对称距离矩阵。最佳贪婪解(从不同城市开始的最近的第一个)作为初始解存储在
数据中。我有两个函数:
solve\u from\u initial\u route()
solve\u from\u scratch()
,它们可以解决相同的问题,无论是否有初始解决方案的信息,也可以产生相同的结果。解算器在这里表现出一些令人惊讶的行为:

  • 函数
    solve_from_initial_route()
    生成初始贪婪解决方案作为最终解决方案,并立即退出(4-5毫秒),无需尝试求解和生成运行时日志(即使启用了搜索日志记录)
  • 函数
    solve\u from\u scratch()
    也会生成与最终解决方案相同的贪婪解决方案,并生成运行时日志,显示它已评估了许多选项。但有趣的是,无论我运行解算器多长时间,解都是一样的。解算器不知何故动作不灵活,总是在评估更糟糕的选项。另一方面,在同一问题上运行的遗传算法在不到1秒的时间内产生了比贪婪初始解更好的解
  • 我也尝试过所有其他的局部搜索选项,对于随机算法,比如模拟退火,你会期望在不同的时间限制内看到结果的一些变化,但这不会发生,而且解总是与初始贪婪解相同
  • 此外,布线解算器将继续运行,即使它在技术上应该已评估了所有组合。有10个城市,总共有10个!=总共要评估3628800个序列,但限制高于此限制,解算器将继续运行,直到达到搜索限制而不是实际问题限制
可能是我没有正确设置所有选项,或者代码中缺少某些内容。如果您能帮助我使解算器按预期工作,我将不胜感激

谢谢

!pip安装或工具
来自未来导入打印功能
从ortools.constraint_解算器导入pywrapcp
从ortools.constraint\u解算器导入路由\u枚举\u pb2
def create_data_model():
“”“存储问题的数据。”“”
数据={}
数据['distance_matrix']=[
[0, 227543, 133934, 200896, 106495, 163222, 75896, 139494, 46460, 102942],
[135873, 0, 15673, 174874, 80474, 197318, 109993, 232377, 139343, 46665],
[229482, 15673, 0, 88692, 183092, 125214, 214714, 153718, 247723, 140274],
[108503, 174151, 80542, 0, 15674, 169948, 82622, 205007, 111973, 49550],
[195308, 94193, 167348, 21174, 0, 105716, 169428, 134221, 198779, 136356],
[77835, 203602, 109992, 176954, 82554, 0, 15660, 174340, 81306, 79000],
[172835, 119784, 213500, 94785, 189185, 21172, 0, 96019, 190024, 174000],
[48413, 232967, 139358, 206320, 111919, 168647, 81321, 0, 15662, 108366],
[141422, 153773, 247490, 128774, 204928, 101504, 174329, 15662, 0, 201374],
[104492, 139205, 45595, 143494, 49093, 165938, 78612, 200997, 107963, 0]
]
数据['initial_routes']=[
[8, 7, 6, 5, 4, 3, 2, 1]
]
数据['num_vehicles']=1
数据['start_idx']=[0]
数据['end_idx']=[9]
返回数据
def打印解决方案(数据、管理器、路由、解决方案):
“”“在控制台上打印解决方案。”“”
最大路径距离=0
对于范围内的车辆id(数据['num\u vehicles']):
索引=路线。启动(车辆id)
计划输出='车辆路线{}:\n'。格式(车辆id)
路线距离=0
而不是路由。IsEnd(索引):
计划输出+='{}->'.format(manager.IndexToNode(index))
上一个索引=索引
index=solution.Value(routing.NextVar(index))
route_distance+=routing.GetArcCostForVehicle(
以前的索引、索引、车辆id)
计划输出+='{}\n'.格式(manager.IndexToNode(index))
平面输出+='路线距离:{}m\n'。格式(路线距离)
打印(计划输出)
最大路线距离=最大(路线距离,最大路线距离)
打印('路由距离的最大值:{}m'。格式(最大路由距离))
def solve_from_initial_route():
“”“解决CVRP问题。”“”
#实例化数据问题。
数据=创建数据模型()
#创建路由索引管理器。
manager=pywrapcp.RoutingIndexManager(len(数据['距离矩阵]),
数据['num_vehicles'],数据['start_idx'],
数据['end_idx'])
#创建路由模型。
路由=pywrapcp.RoutingModel(管理器)
#创建并注册中转回调。
def距离_回调(从_索引到_索引):
“”“返回两个节点之间的距离。”“”
#将路由变量索引转换为距离矩阵节点索引。
from_node=manager.IndexToNode(from_index)
to_node=manager.IndexToNode(to_index)
返回数据['distance_matrix'][从_节点][到_节点]
transit\u callback\u index=routing.RegisterTransitCallback(距离\u回调)
#定义每个弧的成本。
路线。所有车辆的SetArcCostEvaluatorofall Vehicles(运输回收索引)
initial_solution=routing.ReadAssignmentFromRoutes(数据['initial_routes',],True)
打印('初始解决方案:')
打印解决方案(数据、管理器、路由、初始解决方案)
#设置默认搜索参数。
search_parameters=pywrapcp.DefaultRoutingSearchParameters()
烧焦
Solution after search:
Route for vehicle 0:
 0 ->  8 ->  7 ->  6 ->  5 ->  4 ->  3 ->  2 ->  1 -> 9
Distance of the route: 411223m
Solution #5265 (783010, objective minimum = 411223, objective maximum = 1103173, time = 1998 ms, branches = 26227, failures = 14386, depth = 33, OrOpt<3>, neighbors = 351904, filtered neighbors = 5265, accepted neighbors = 5265, memory used = 35.63 MB, limit = 99%)
# Create the routing index manager.
manager = pywrapcp.RoutingIndexManager(len(data['distance_matrix']),
                                       data['num_vehicles'], 
                                       data['start_idx'],
                                       data['end_idx'])

# Create Routing Model.
routing = pywrapcp.RoutingModel(manager)


# Create and register a transit callback.
def distance_callback(from_index, to_index):
    """Returns the distance between the two nodes."""
    # Convert from routing variable Index to distance matrix NodeIndex.
    from_node = manager.IndexToNode(from_index)
    to_node = manager.IndexToNode(to_index)
    return data['distance_matrix'][from_node][to_node]

transit_callback_index = routing.RegisterTransitCallback(distance_callback)

# Define cost of each arc.
routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)

# Set default search parameters.
search_parameters = pywrapcp.DefaultRoutingSearchParameters()
search_parameters.first_solution_strategy = (routing_enums_pb2.FirstSolutionStrategy.PATH_CHEAPEST_ARC)
search_parameters.local_search_metaheuristic = (routing_enums_pb2.LocalSearchMetaheuristic.GUIDED_LOCAL_SEARCH)
search_parameters.time_limit.seconds = 1
search_parameters.lns_time_limit.seconds = 1
search_parameters.solution_limit = 15000
search_parameters.log_search = True

routing.CloseModelWithParameters(search_parameters)

initial_solution = routing.ReadAssignmentFromRoutes(data['initial_routes'],
                                                    True)
print('Initial solution:')
print_solution(data, manager, routing, initial_solution)


# Solve the problem.
solution =  routing.SolveFromAssignmentWithParameters(initial_solution, search_parameters)