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

SciPy中optimize.shgo无法传递参数至局部极小值求解器的问题

问题分析与解决方案

你的问题出在SHGO算法对局部求解器参数的传递逻辑以及可能的版本兼容性上,以下是具体分析和解决办法:

核心问题原因

  1. 参数传递的潜在结构问题:
    SHGO的minimizer_kwargs是直接传递给scipy.optimize.minimize的参数字典,带约束的问题默认使用SLSQP求解器。你的{'options':{'maxiter':2}}结构看似正确,但在部分旧版本SciPy中,SHGO存在参数传递bug,导致求解器的options未被正确应用。

  2. 版本兼容性限制:
    在SciPy 1.7.x之前的版本中,SHGO对minimizer_kwargs的处理存在缺陷,无法正确将options传递给底层局部求解器,这会导致你设置的maxiter和disp参数完全失效。

验证与修复步骤

1. 显式指定局部求解器

修改代码,显式指定局部求解器为SLSQP,确保options参数被正确传递:

res = scipy.optimize.shgo(f, bounds, n=150, constraints=cons,
           minimizer_kwargs={'method': 'SLSQP', 'options':{'maxiter':2, 'disp':True}},
           options={'disp':True})

显式指定method可以避免SHGO自动选择求解器时的参数丢失问题,确保options被传递到正确的求解器实例中。

2. 检查局部求解结果

运行代码后,通过res.local_optima查看每个局部优化的结果,其中每个元素的nit字段应该对应你设置的maxiter值(或因约束可行性提前终止,但不会是默认的8次迭代)。

3. 升级SciPy版本

如果上述修改后参数仍未生效,说明你使用的SciPy版本存在bug,建议升级到1.7.x及以上的稳定版本:

pip install --upgrade scipy

额外说明

  • SLSQP求解器的maxiter是迭代次数上限,若求解器在达到上限前满足收敛条件,实际迭代次数会小于设置值。但你的案例中迭代次数远大于设置值,显然是参数未被传递导致的。
  • disp=True需要在局部求解器的options中设置,才能显示局部求解的过程日志;SHGO自身的options={'disp':True}仅控制全局搜索的日志输出。

内容的提问来源于stack exchange,提问作者MoucheMoustique

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:55:25