如何在不使用全局变量的情况下展示优化器的迭代进度?
解决方案:移除全局变量并收集优化改进结果
方法一:使用闭包封装状态
闭包可以在不依赖全局变量的前提下,封装跟踪最优值的状态和存储改进结果的列表,同时让主代码能直接获取结果列表。
import dlib from scipy.optimize import rosen def create_rosen_tracker(): # 用列表存储最优值(列表是可变对象,闭包内可修改) current_best = [2**30] improvements = [] def rosen_f(*x): result = rosen(x) if result < current_best[0]: current_best[0] = result record = (x, result) improvements.append(record) print("New min", record) return result # 返回目标函数和结果列表 return rosen_f, improvements # 主代码调用 rosen_opt, improvement_list = create_rosen_tracker() dlib.find_min_global(rosen_opt, [0]*5, [0.5]*5, 1000) # 直接使用收集到的改进结果 print("\n所有优化改进记录:") for item in improvement_list: print(item)
方法二:使用类管理状态
如果后续需要扩展更多功能(比如记录迭代次数、时间戳),用类来封装状态和目标函数会更清晰、易维护。
import dlib from scipy.optimize import rosen class RosenOptimizer: def __init__(self): self.current_best = 2**30 self.improvements = [] def objective_func(self, *x): result = rosen(x) if result < self.current_best: self.current_best = result record = (x, result) self.improvements.append(record) print("New min", record) return result # 主代码调用 optimizer = RosenOptimizer() dlib.find_min_global(optimizer.objective_func, [0]*5, [0.5]*5, 1000) # 访问改进结果列表 print("\n所有优化改进记录:") for item in optimizer.improvements: print(item)
说明
两种方法都满足需求:
- 完全移除了全局变量,状态被封装在闭包或类实例中
- 每次找到更优值时,会将
(参数, 结果)存入列表,主代码可直接访问该列表做后续处理
内容的提问来源于stack exchange,提问作者Simd
相关产品推荐
相关产品推荐

