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

如何让scipy.optimize.minimize在n次无迭代提升后停止?

实现scipy.optimize.minimize连续无进展时停止迭代

核心思路

借助scipy.optimize.minimize的callback参数,在每次迭代后检查当前解的目标函数值是否优于历史最优值,同时维护一个计数器:

  • 找到更优解时,重置计数器并更新最优值
  • 计数器达到设定阈值时,返回True触发优化终止

代码实现

用闭包实现带状态的回调函数(比类写法更简洁):

from scipy.optimize import minimize
import numpy as np

def create_stop_callback(max_stagnant_iter):
    best_score = np.inf
    stagnant_count = 0
    
    def callback(xk):
        nonlocal best_score, stagnant_count
        current_score = objective_function(xk)  # 替换为你的目标函数
        
        # 加小epsilon规避浮点精度误差导致的误判
        if current_score < best_score - 1e-9:
            best_score = current_score
            stagnant_count = 0
        else:
            stagnant_count += 1
            if stagnant_count >= max_stagnant_iter:
                print(f"连续{max_stagnant_iter}次迭代无进展,终止优化")
                return True  # 返回True会触发minimize停止
    
    return callback

调用示例:

def objective_function(x):
    # 替换为你的实际目标函数
    return (x[0] - 2)**2 + (x[1] - 3)**2

# 初始猜测值
x0 = np.array([0, 0])

# 创建回调:连续5次无进展就停止
stop_callback = create_stop_callback(max_stagnant_iter=5)

# 执行优化,无需额外设置maxiter(若需限制总迭代次数可在options中添加)
result = minimize(objective_function, x0, method='BFGS', callback=stop_callback)

print("优化结果:")
print(result)

关键细节

  • 浮点精度处理:加入1e-9的阈值,避免因浮点计算的微小波动误判为无进展
  • 回调返回规则:回调函数返回True时,minimize会立即终止迭代
  • 方法兼容性:该方案适用于所有支持callback参数的优化方法(如BFGS、L-BFGS-B、Nelder-Mead等)

适配说明

  • 若目标是最大化问题,需将判断条件改为current_score > best_score + 1e-9
  • 如需同时限制总迭代次数,可在options中设置maxiter,此时优化会在任一条件满足时停止

内容的提问来源于stack exchange,提问作者Vincent Bénet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:15:31