@@ -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
2141def 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
128147def 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
144188tsp ([[1 , 1 ], [2 , 5 ], [8 , 0 ]])
0 commit comments