1
1
#!/usr/bin/env python3
2
2
3
-
4
3
def tsp (distances : list [list [int ]]) -> int :
5
4
"""
6
5
Solves the Travelling Salesman Problem (TSP)
7
6
using dynamic programming and bitmasking.
8
-
9
7
Args:
10
8
distances: 2D list where distances[i][j]
11
9
is the distance between city i and city j.
12
-
13
10
Returns:
14
- Minimum cost to complete the tour visiting all cities.
15
-
11
+ Minimum cost to complete the
12
+ tour visiting all cities.
16
13
Raises:
17
14
ValueError: If any distance is negative.
18
15
@@ -31,18 +28,17 @@ def tsp(distances: list[list[int]]) -> int:
31
28
n = len (distances )
32
29
if any (distances [i ][j ] < 0 for i in range (n ) for j in range (n )):
33
30
raise ValueError ("Distance cannot be negative" )
34
-
35
31
# Memoization table
36
32
memo = [[- 1 ] * (1 << n ) for _ in range (n )]
37
33
visited_all = (1 << n ) - 1 # All cities visited mask
38
-
39
34
def visit (city : int , mask : int ) -> int :
40
35
"""Recursively calculates the minimum cost to visit all cities."""
41
36
if mask == visited_all :
42
37
return distances [city ][0 ] # Return to the starting city
38
+
43
39
if memo [city ][mask ] != - 1 : # Return cached result if exists
44
40
return memo [city ][mask ]
45
- min_cost = float (" inf" ) # Use infinity for initial comparison
41
+ min_cost = float (' inf' ) # Use infinity for initial comparison
46
42
for next_city in range (n ):
47
43
if not (mask & (1 << next_city )): # If unvisited
48
44
new_cost = distances [city ][next_city ] + visit (
@@ -51,11 +47,10 @@ def visit(city: int, mask: int) -> int:
51
47
min_cost = min (min_cost , new_cost )
52
48
memo [city ][mask ] = int (min_cost ) # Store result as an integer
53
49
return memo [city ][mask ] # Return the cached result
54
-
55
50
return visit (0 , 1 ) # Start from city 0 with city 0 visited
56
-
57
-
58
51
if __name__ == "__main__" :
59
52
import doctest
60
-
61
- doctest .testmod ()
53
+ try :
54
+ doctest .testmod ()
55
+ except Exception as e :
56
+ print (f"An error occurred during doctest: { e } " )
0 commit comments