You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用全局变量的情况下展示优化器的迭代进度?

解决方案:移除全局变量并收集优化改进结果

方法一:使用闭包封装状态

闭包可以在不依赖全局变量的前提下,封装跟踪最优值的状态和存储改进结果的列表,同时让主代码能直接获取结果列表。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:12:03