]> Skullheadx's Git Forge - The-Traveling-Salesman-Problem.git/commitdiff
christofides done
authorSkullheadx <94652084+Skullheadx@users.noreply.github.com>
Sun, 8 Jan 2023 03:31:33 +0000 (22:31 -0500)
committerSkullheadx <94652084+Skullheadx@users.noreply.github.com>
Sun, 8 Jan 2023 03:31:33 +0000 (22:31 -0500)
Christofides.py
display.py
main.py

index 5354507aa0cac4c0517cfb9281772d7f2a7ce023..b3316e8d9d2565f5991cdd53f21acdac09a1f83f 100644 (file)
@@ -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
 
 """
 
index 8f26b13688b6fd3d60d82eba76f336e830acc664..3f080a33755247ac230d9b735c449d6d4c60ced5 100644 (file)
@@ -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 c092c127280abc21cb5e127b96cb279b55b8eb59..259ca8d36008455c8de0859c63c0006915e5c38b 100644 (file)
--- 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()