from copy import deepcopy
def linker2(points):
+ route = []
graph = dict()
for pair in 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)
eulerian_tour = linker2(multigraph)
#
- print(eulerian_tour)
#
# print(g)
- return perfect_matching
+ return eulerian_tour
"""
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
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:
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)))
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
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)
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()