@@ -62,8 +62,9 @@ def draw_nodes(win, nodes, order=[], current_edge=None, best_dist=0):
6262 pygame .display .update ()
6363
6464def solve_nearest_neighbor (nodes ):
65- if len (nodes ) < 2 : return
66-
65+ if len (nodes ) < 2 :
66+ return [], 0
67+
6768 unvisited = list (range (1 , len (nodes )))
6869 current = 0
6970 order = [0 ]
@@ -78,20 +79,29 @@ def solve_nearest_neighbor(nodes):
7879 nearest = min (unvisited , key = lambda x : get_distance (nodes [current ], nodes [x ]))
7980
8081 # Animate the connection being tested
81- draw_nodes (WIN , nodes , order , current_edge = (nodes [current ], nodes [nearest ]), best_dist = path_distance (nodes , order ))
82+ draw_nodes (
83+ WIN ,
84+ nodes ,
85+ order ,
86+ current_edge = (nodes [current ], nodes [nearest ]),
87+ best_dist = path_distance (nodes , order )
88+ )
8289 pygame .time .delay (100 )
8390
8491 order .append (nearest )
8592 unvisited .remove (nearest )
8693 current = nearest
8794
88- draw_nodes (WIN , nodes , order , best_dist = path_distance (nodes , order ))
89-
95+ best_dist = path_distance (nodes , order )
96+ draw_nodes (WIN , nodes , order , best_dist = best_dist )
97+ return order , best_dist
98+
9099def solve_brute_force (nodes ):
91- if len (nodes ) < 2 : return
100+ if len (nodes ) < 2 :
101+ return [], 0
92102 if len (nodes ) > 10 :
93103 print ("Too many nodes for brute force! (Max 10 recommended)" )
94- return
104+ return [], 0
95105
96106 min_dist = float ('inf' )
97107 best_order = []
@@ -112,12 +122,19 @@ def solve_brute_force(nodes):
112122 if dist < min_dist :
113123 min_dist = dist
114124 best_order = current_order
115-
125+
116126 count += 1
117- if count % max (1 , total // 100 ) == 0 : # animate periodically
118- draw_nodes (WIN , nodes , best_order , current_edge = (nodes [current_order [- 1 ]], nodes [current_order [0 ]]), best_dist = min_dist )
119-
127+ if count % max (1 , total // 100 ) == 0 :
128+ draw_nodes (
129+ WIN ,
130+ nodes ,
131+ best_order ,
132+ current_edge = (nodes [current_order [- 1 ]], nodes [current_order [0 ]]),
133+ best_dist = min_dist
134+ )
135+
120136 draw_nodes (WIN , nodes , best_order , best_dist = min_dist )
137+ return best_order , min_dist
121138
122139def main ():
123140 nodes = []
@@ -142,7 +159,7 @@ def main():
142159 if event .key == pygame .K_c :
143160 nodes = []
144161 order = []
145- best_dist = 0
162+ best_dist = 0
146163 elif event .key == pygame .K_r :
147164 nodes = []
148165 for _ in range (10 ):
@@ -153,17 +170,18 @@ def main():
153170 best_dist = 0
154171 elif event .key == pygame .K_1 :
155172 if len (nodes ) > 1 :
156- solve_nearest_neighbor (nodes )
173+ order , best_dist = solve_nearest_neighbor (nodes
174+
157175 elif event .key == pygame .K_2 :
158176 if len (nodes ) > 1 :
159177 if len (nodes ) > 10 :
160178 draw_text (WIN , "Too many nodes for Brute Force! Use <= 10." , 10 , 100 , RED )
161179 pygame .display .update ()
162180 pygame .time .delay (2000 )
163181 else :
164- solve_brute_force (nodes )
182+ order , best_dist = solve_brute_force (nodes
165183
166184 pygame .quit ()
167-
185+
168186if __name__ == "__main__" :
169187 main ()
0 commit comments