return shortest_route
-def print_info(route: list, time: float, method_name: str, mst: float, ot: float, r=0) -> None:
+def print_info(route: list, time: float, method_name: str, one_tree: float, one_tree_time:float, r=0) -> None:
print(
f"""
Traveling Salesman Problem
Time Used: {round(time, r):,} seconds
Number of Nodes: {(len(route) - 1):,}
Distance: {round(calculate_route(route), r):,}
-Minimum Spanning Tree: {round(mst, r):,}
-One Tree: {round(ot, r):,}
+One Tree Lower Bound: {round(one_tree, r):,}
+One Tree Time Used: {round(one_tree_time, r):,}
""")
def find_one_tree(graph: list) -> float:
- removed_vertex = graph[0]
- mst = find_MST(graph[1:])
- distances = []
- for town in graph[1:]:
- distances.append(distance(removed_vertex, town))
- distances.sort()
- return mst + distances[1]
+ lower_bound = None
+
+ for removed_vertex in graph:
+ g = graph[:graph.index(removed_vertex)] + graph[graph.index(removed_vertex)+1:]
+ mst = find_MST(g)
+ distances = []
+ for town in g:
+ distances.append(distance(removed_vertex, town))
+ distances.sort()
+ d = mst + distances[1]
+ if lower_bound is None or d < lower_bound:
+ lower_bound = d
+ return lower_bound
filename = "graph1.txt"
graph = read(GRAPH_PATH, filename)
- time_start = perf_counter()
+ route_time_start = perf_counter()
# route = brute_force(graph) # 10 nodes in 85.042 seconds. Optimal = 2,262.29
route = nearest_neighbor(graph) # 100 nodes in 0.5762094999663532 seconds. Distance = 6,270.568142156188
- time_end = perf_counter()
+ route_time_end = perf_counter()
- MST = find_MST(graph)
- ONE_TREE = find_one_tree(graph)
+ # MST = find_MST(graph)
+ one_tree_time_start = perf_counter()
+ one_tree = find_one_tree(graph)
+ one_tree_time_end = perf_counter()
- print_info(route, time_end - time_start, "NN Heuristic", MST, ONE_TREE, r=100)
+ print_info(route, route_time_end - route_time_start, "NN Heuristic", one_tree, one_tree_time_end-one_tree_time_start,r=100)
display = Display(os.path.join(GRAPH_PATH, filename), route)
display.show()