From: Skullheadx <94652084+Skullheadx@users.noreply.github.com> Date: Sun, 8 Jan 2023 03:31:33 +0000 (-0500) Subject: christofides done X-Git-Url: http://git.skullheadx.com/nixos/README?a=commitdiff_plain;h=e655d899082ab4a73202b8e610e3aead024398e6;p=The-Traveling-Salesman-Problem.git christofides done --- diff --git a/Christofides.py b/Christofides.py index 5354507..b3316e8 100644 --- a/Christofides.py +++ b/Christofides.py @@ -4,6 +4,7 @@ from collections import Counter from copy import deepcopy def linker2(points): + route = [] graph = dict() for pair in points: @@ -17,27 +18,40 @@ def linker2(points): graph[end].append(start) else: graph[end] = [start] - print(graph) q = Queue() - q.put([points[0][0]]) + q.put(([points[0][0]], points[:])) seen = set() while not q.empty(): - current = q.get() + current, pts = q.get() if tuple(current) in seen: continue else: seen.add(tuple(current)) - if Counter(current) == Counter(points): - return current - print(current, points) - for i in graph[current[-1]]: - temp = deepcopy(current) - temp.append(i) - q.put(temp) + if len(pts) == 0: + s = set() + for i in current: + if i not in s: + route.append(i) + s.add(i) + break - return [] + for i in graph[current[-1]]: + if (current[-1], i) in pts: + temp = deepcopy(current) + temp.append(i) + temp2 = pts[:] + temp2.remove((current[-1], i)) + q.put((temp,temp2)) + elif (i,current[-1]) in pts: + temp = deepcopy(current) + temp.append(i) + temp2 = pts[:] + temp2.remove((i,current[-1])) + q.put((temp,temp2)) + + return route def christofides(graph: list): _, mst = find_MST(graph) @@ -91,10 +105,9 @@ def christofides(graph: list): eulerian_tour = linker2(multigraph) # - print(eulerian_tour) # # print(g) - return perfect_matching + return eulerian_tour """ diff --git a/display.py b/display.py index 8f26b13..3f080a3 100644 --- a/display.py +++ b/display.py @@ -95,7 +95,7 @@ class Display: if mode == "points": self.route = linker(self.route) - # self.salesman = Salesman(self.route) + self.salesman = Salesman(self.route) self.mst = mst self.one_tree = one_tree @@ -114,7 +114,7 @@ class Display: if event.type == pygame.QUIT: is_running = False - # self.salesman.update(delta) + self.salesman.update(delta) self.screen.fill(WHITE) if self.one_tree is not None: @@ -125,7 +125,7 @@ class Display: if self.mst is not None: for i, line in enumerate(self.mst): # Minimum Spanning Tree start, end = line - pygame.draw.line(self.screen, ORANGE, start, end, 4) + pygame.draw.line(self.screen, ORANGE, start, end, 12) # text = self.font.render(str(i), True, (0,0,0)) # self.screen.blit(text, text.get_rect(center=((start[0]+end[0])/2,(end[1]+start[1])/2))) @@ -135,7 +135,7 @@ class Display: for i, node in enumerate(self.nodes): node.draw(self.screen) - # self.salesman.draw(self.screen) + self.salesman.draw(self.screen) pygame.display.update() delta = clock.tick(60) / 1000 # Seconds diff --git a/main.py b/main.py index c092c12..259ca8d 100644 --- a/main.py +++ b/main.py @@ -23,7 +23,7 @@ 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, 15) else: filename = "graph1.txt" graph = read(GRAPH_PATH, filename) @@ -39,15 +39,15 @@ def main(): MST_distance, MST = find_MST(graph) print("MST_DISTANCE:", MST_distance) one_tree_time_start = perf_counter() - lower_bound,one_tree = find_one_tree(graph) + # lower_bound, one_tree = find_one_tree(graph) removed_vertex = graph[0] - # lower_bound, one_tree, removed_vertex = find_lower_bound(graph) + lower_bound, one_tree, removed_vertex = find_lower_bound(graph) 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="direct") + print_info(route, route_time_end - route_time_start, "Christofides Algorithm", lower_bound, + one_tree_time_end - one_tree_time_start, r=3000, mode="direct") - display = Display(os.path.join(GRAPH_PATH, filename), [], mst=route, one_tree=MST, + display = Display(os.path.join(GRAPH_PATH, filename), route, mst=MST, one_tree=None, removed_vertex=removed_vertex, mode="direct") display.show()