@@ -21,7 +21,17 @@ def __init__(
2121 min_temperature : float = 1e-3 ,
2222 iterations_per_temp : int = 100 ,
2323 neighbor_scale : float = 0.1 ,
24- local_search : Optional [Callable [[Sequence [float ], Callable [[Sequence [float ]], float ], Callable [[Sequence [float ]], Sequence [float ]], int ], Tuple [Sequence [float ], float ]]] = None ,
24+ local_search : Optional [
25+ Callable [
26+ [
27+ Sequence [float ],
28+ Callable [[Sequence [float ]], float ],
29+ Callable [[Sequence [float ]], Sequence [float ]],
30+ int ,
31+ ],
32+ Tuple [Sequence [float ], float ],
33+ ]
34+ ] = None ,
2535 local_search_iters : int = 10 ,
2636 seed : Optional [int ] = None ,
2737 ):
@@ -70,7 +80,12 @@ def _accept(self, delta: float, temp: float) -> bool:
7080 prob = 0.0
7181 return random .random () < prob
7282
73- def optimize (self , max_steps : Optional [int ] = None , stop_event : Optional [object ] = None , progress_callback : Optional [Callable [[int , float , float ], None ]] = None ) -> Tuple [List [float ], float , dict ]:
83+ def optimize (
84+ self ,
85+ max_steps : Optional [int ] = None ,
86+ stop_event : Optional [object ] = None ,
87+ progress_callback : Optional [Callable [[int , float , float ], None ]] = None ,
88+ ) -> Tuple [List [float ], float , dict ]:
7489 """Run optimization and return best solution, cost, and history.
7590
7691 New optional args:
@@ -91,15 +106,23 @@ def optimize(self, max_steps: Optional[int] = None, stop_event: Optional[object]
91106 while temp > self .min_temperature :
92107 for _ in range (self .iterations_per_temp ):
93108 # Check stop event
94- if stop_event is not None and getattr (stop_event , "is_set" , lambda : False )():
109+ if (
110+ stop_event is not None
111+ and getattr (stop_event , "is_set" , lambda : False )()
112+ ):
95113 self .current = current
96114 return best , best_cost , history
97115
98116 candidate = self ._neighbor (current )
99117 # Optionally refine candidate with local search before evaluating/accepting
100118 if self .local_search is not None :
101119 try :
102- improved , improved_cost = self .local_search (candidate , self .func , self ._neighbor , self .local_search_iters )
120+ improved , improved_cost = self .local_search (
121+ candidate ,
122+ self .func ,
123+ self ._neighbor ,
124+ self .local_search_iters ,
125+ )
103126 candidate = list (improved )
104127 candidate_cost = float (improved_cost )
105128 except Exception :
@@ -120,7 +143,10 @@ def optimize(self, max_steps: Optional[int] = None, stop_event: Optional[object]
120143 history ["current_costs" ].append (current_cost )
121144
122145 steps += 1
123- if progress_callback is not None and steps % max (1 , self .iterations_per_temp // 10 ) == 0 :
146+ if (
147+ progress_callback is not None
148+ and steps % max (1 , self .iterations_per_temp // 10 ) == 0
149+ ):
124150 try :
125151 progress_callback (steps , best_cost , current_cost )
126152 except Exception :
@@ -141,12 +167,19 @@ def optimize(self, max_steps: Optional[int] = None, stop_event: Optional[object]
141167def _test_quadratic ():
142168 # Simple test: minimize f(x) = (x-3)^2
143169 func = lambda x : (x [0 ] - 3 ) ** 2
144- sa = SimulatedAnnealing (func , [0.0 ], bounds = [(- 10 , 10 )], temperature = 10 , iterations_per_temp = 50 )
170+ sa = SimulatedAnnealing (
171+ func , [0.0 ], bounds = [(- 10 , 10 )], temperature = 10 , iterations_per_temp = 50
172+ )
145173 best , cost , hist = sa .optimize ()
146174 print ("best:" , best , "cost:" , cost )
147175
148176
149- def simple_local_search (solution : Sequence [float ], func : Callable [[Sequence [float ]], float ], neighbor_fn : Callable [[Sequence [float ]], Sequence [float ]], iterations : int = 10 ) -> Tuple [Sequence [float ], float ]:
177+ def simple_local_search (
178+ solution : Sequence [float ],
179+ func : Callable [[Sequence [float ]], float ],
180+ neighbor_fn : Callable [[Sequence [float ]], Sequence [float ]],
181+ iterations : int = 10 ,
182+ ) -> Tuple [Sequence [float ], float ]:
150183 """A tiny hill-climbing local search that repeatedly accepts improving neighbors.
151184
152185 Parameters
0 commit comments