OR 工具返回值为 0 的解决方案

OR-tools returning solution with 0 values

我正在尝试使用 OR 工具解决 TSP 问题,但是当更改距离矩阵以进行挖掘时,结果为 0。

这是我用于 运行 我的代码的距离矩阵。

 data['distance_matrix'] = [[0.         0.40133922 0.58308059 0.44763244 0.59232887 0.13190757
  0.5562759  0.12633011 0.78330022 0.17998744]
 [0.40133922 0.         0.55530878 0.12847738 0.20445115 0.27022701
  0.30111459 0.52368492 0.44647366 0.27820636]
 [0.58308059 0.55530878 0.         0.68351728 0.56187331 0.55400228
  0.33387128 0.67251728 0.52304621 0.43480849]
 [0.44763244 0.12847738 0.68351728 0.         0.26454783 0.31920079
  0.41996521 0.5580511  0.52643066 0.36789118]
 [0.59232887 0.20445115 0.56187331 0.26454783 0.         0.46525396
  0.23296919 0.71765895 0.26265452 0.44149353]
 [0.13190757 0.27022701 0.55400228 0.31920079 0.46525396 0.
  0.45765072 0.25362887 0.67092774 0.11976824]
 [0.5562759  0.30111459 0.33387128 0.41996521 0.23296919 0.45765072
  0.         0.67900157 0.24463744 0.37723255]
 [0.12633011 0.52368492 0.67251728 0.5580511  0.71765895 0.25362887
  0.67900157 0.         0.90875577 0.30180013]
 [0.78330022 0.44647366 0.52304621 0.52643066 0.26265452 0.67092774
  0.24463744 0.90875577 0.         0.60904638]
 [0.17998744 0.27820636 0.43480849 0.36789118 0.44149353 0.11976824
  0.37723255 0.30180013 0.60904638 0.        ]]

这是我得到的结果

Objective: 0 公里 车辆 0 的路线: 0 -> 9 -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> 0 路线距离:0Kms

from ortools.constraint_solver import routing_enums_pb2
from ortools.constraint_solver import pywrapcp

def create_data_model():
    """Stores the data for the problem."""
    data = {}
    data['distance_matrix'] = distance_matrix
    data['num_vehicles'] = 1
    data['depot'] = 0
    return data
def print_solution(manager, routing, solution):
    """Prints solution on console."""
    print('Objective: {} Kms'.format(solution.ObjectiveValue()))
    index = routing.Start(0)
    plan_output = 'Route for vehicle 0:\n'
    route_distance = 0
    while not routing.IsEnd(index):
        plan_output += ' {} ->'.format(manager.IndexToNode(index))
        previous_index = index
        index = solution.Value(routing.NextVar(index))
        route_distance += routing.GetArcCostForVehicle(previous_index, index, 0)
    plan_output += ' {}\n'.format(manager.IndexToNode(index))
    plan_output += 'Route distance: {}Kms\n'.format(route_distance)
    print(plan_output)

data = create_data_model()

# Create the routing index manager.
manager = pywrapcp.RoutingIndexManager(len(data['distance_matrix']),
                                       data['num_vehicles'], data['depot'])

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

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]

# Create and register a transit callback.
transit_callback_index = routing.RegisterTransitCallback(distance_callback)

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

# Setting first solution heuristic.
search_parameters = pywrapcp.DefaultRoutingSearchParameters()
search_parameters.first_solution_strategy = (
    routing_enums_pb2.FirstSolutionStrategy.PATH_CHEAPEST_ARC)

# Solve the problem.
solution = routing.SolveWithParameters(search_parameters)

if solution:
    print_solution(manager,routing,solution)
    print(solution.ObjectiveValue())
else:
    print('No Solution')

解算器是积分的,python默默地将所有距离值四舍五入为0。

您应该按常数因子(例如 1000)缩放所有内容并四舍五入为整数。

参见官方指南上的注释:https://developers.google.com/optimization/routing/tsp