Skip to content

Commit 61477a9

Browse files
committed
Complete algorithm
1 parent ced235e commit 61477a9

1 file changed

Lines changed: 45 additions & 1 deletion

File tree

christofides.py

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,26 @@ def tsp(data):
1717
minimum_weight_matching(MSTree, G, odd_vertexes)
1818
print("Minimum weight matching: ", MSTree)
1919

20+
eulerian_tour = find_eulerian_tour(MSTree)
21+
visited = [False] * (len(eulerian_tour) - 1)
22+
23+
24+
print("Eulerian tour: ", eulerian_tour)
25+
26+
current = eulerian_tour[0]
27+
paths = [current]
28+
for x in eulerian_tour[1:]:
29+
if not visited[x]:
30+
visited[x] = True
31+
32+
paths.append(x)
33+
length += G[current][x]
34+
35+
current = x
36+
37+
print("Result path: ", paths)
38+
print("Result length of the path: ", length)
39+
2040

2141
def get_length(x1, y1, x2, y2):
2242
return ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** (1 / 2)
@@ -124,7 +144,6 @@ def find_odd_vertexes(MST):
124144
return vertexes
125145

126146

127-
# utility function that adds minimum weight matching edges to MST
128147
def minimum_weight_matching(MST, G, odd_vert):
129148
while odd_vert:
130149
v = odd_vert.pop()
@@ -140,5 +159,30 @@ def minimum_weight_matching(MST, G, odd_vert):
140159
odd_vert.remove(closest)
141160

142161

162+
def find_eulerian_tour(MatchedMSTree):
163+
tour = []
164+
165+
start_vertex = MatchedMSTree[0][0]
166+
167+
tour.append(start_vertex)
168+
169+
while len(MatchedMSTree) > 0:
170+
current_vertex = tour[len(tour) - 1]
171+
for edge in MatchedMSTree:
172+
if current_vertex in edge:
173+
if edge[0] == current_vertex:
174+
current_vertex = edge[1]
175+
elif edge[1] == current_vertex:
176+
current_vertex = edge[0]
177+
else:
178+
# Edit to account for case no tour is possible
179+
return False
180+
181+
MatchedMSTree.remove(edge)
182+
tour.append(current_vertex)
183+
break
184+
185+
return tour
186+
143187

144188
tsp([[1, 1], [2, 5], [8, 0]])

0 commit comments

Comments
 (0)