|
- """Solve a non-symmetric TSP problem.
-
- Triangular inequality is not required in this problem.
- """
-
- import math
- import pdb
- import random
- import sys
- from itertools import combinations, permutations
-
-
- def solve_tsp(dists: dict) -> float:
- """Solve the TSP problem
-
- Args:
- dists (dict): the distance matrix between each nodes. Each item in the
- dict is a pair (node A, node B) to the distance from A to B.
-
- Returns:
- float: the optimal cost
- """
- # Get the unique nodes from the distance matrix
- nodes = set()
- for pair in dists.keys():
- nodes.add(pair[0])
- nodes.add(pair[1])
-
- # Generate all possible routes (permutations of nodes)
- routes = permutations(nodes)
-
- # Initialize the optimal cost as infinite
- optimal_cost = float("inf")
- optimal_route = None
-
- # Iterate through all possible routes
- for route in routes:
- cost = 0
- # Calculate the cost of the current route
- for i in range(len(route)):
- current_node = route[i]
- next_node = route[(i + 1) % len(route)]
- cost += dists[(current_node, next_node)]
-
- # Update the optimal cost if the current cost is smaller
- if cost < optimal_cost:
- optimal_cost = cost
- optimal_route = route
-
- print("Cost:", optimal_cost, "with route", optimal_route)
- return optimal_cost
-
-
- def tsp_data(n: int, seed: int = 2022) -> dict:
- """Generate some sample data for the non-symmetric TSP problem.
-
- Args:
- n (int): number of nodes in the problem
- seed (int): the random seed.
-
- Returns:
- dict: the pairwise distance matrix.
- """
- # Initialize the random seed
- random.seed(seed)
-
- # Initialize the distance matrix
- dist_matrix = {}
-
- # Generate distances for each pair of nodes
- for i in range(n):
- for j in range(n):
- if i != j:
- # Generate a random distance between nodes i and j
- distance = round(random.uniform(1, 100), 2)
- dist_matrix[(i, j)] = distance
-
- return dist_matrix
|