-from graph import distance, find_MST, calculate_route, linker
+from graph import distance, find_MST, calculate_route
from queue import Queue
+def linker2(points):
+ p = points[:]
+ direct = [p[0][0]]
+ head = p[0][0]
+ current = p[0]
+
+ graph = dict()
+
+ for pair in p:
+ start, end = pair
+ if start in graph:
+ graph[start].append(end)
+ else:
+ graph[start] = [end]
+ if end in graph:
+ graph[end].append(start)
+ else:
+ graph[end] = [start]
+ seen = set()
+ seen.add(head)
+ while True:
+ start, end = current
+ direct.append(end)
+ if len(graph[end]) > 2:
+ a = start
+ for ind, i in enumerate(graph[end]):
+ if i != a and ((len(direct) == len(points) - 1 and i == head) or i not in seen):
+ b = i
+ seen.add(i)
+ break
+ else:
+ a, b = graph[end]
+ if b in seen:
+ b = head
+ seen.add(b)
+ if a == start:
+ current = (end, b)
+ else:
+ current = (end, a)
+
+ if end == head:
+ break
+
+ return direct
+
def christofides(graph: list):
- route = []
_, mst = find_MST(graph)
g = {town: [] for town in graph}
for i in mst:
q.put(c)
- multigraph = mst + perfect_matching
- print(f"{odd_degree_vertices=}")
-
- print(f"{mst=}")
- print()
- print(f"{perfect_matching=}")
- print()
- print(f"{multigraph=}")
+ multigraph = perfect_matching + mst
+ # print(f"{odd_degree_vertices=}")
+ # print(f"{mst=}")
+ # print(f"{perfect_matching=}")
+ # print(f"{multigraph=}")
- eulerian_tour = linker(multigraph)
+ eulerian_tour = linker2(multigraph)
print(eulerian_tour)
- print(g)
- return mst
+ # print(g)
+ return eulerian_tour
"""
((300, 438), (24, 97)),
((396, 559), (141, 520)), 3
((24, 97), (490, 227))"""
+
import os
GRAPH_PATH = "graphs/"
-CREATE_NEW_GRAPHS = False
+CREATE_NEW_GRAPHS = True
def main():
print("The file does not exist")
if CREATE_NEW_GRAPHS:
- graph, filename = create(GRAPH_PATH, 640, 640, 5)
+ graph, filename = create(GRAPH_PATH, 640, 640, 10)
else:
filename = "graph1.txt"
graph = read(GRAPH_PATH, filename)
one_tree_time_end = perf_counter()
print_info(route, route_time_end - route_time_start, "Christofides Algorithm", lower_bound,
- one_tree_time_end - one_tree_time_start, r=3000, mode="points")
+ one_tree_time_end - one_tree_time_start, r=3000, mode="direct")
- display = Display(os.path.join(GRAPH_PATH, filename), [], mst=MST, one_tree=route,
+ display = Display(os.path.join(GRAPH_PATH, filename), route, mst=MST, one_tree=None,
removed_vertex=removed_vertex, mode="direct")
display.show()