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

为何Scipy BasinHopping无法返回正确全局最小值?

为什么Basinhopping未找到全局最小值?

Basinhopping作为随机全局优化算法,并非总能保证找到全局最优,你的问题主要由以下几个关键因素导致:

1. 默认随机跳转步长过小

Basinhopping的核心逻辑是:先从起始点做局部优化得到一个局部最小值,再通过随机跳转到新位置,重复局部优化过程。默认的stepsize=0.5步长太小,从x0=-6出发,每次跳转的范围仅在-6±0.5左右,根本碰不到x=0所在的区域。而你的函数在x<0区间存在多个局部最小值(比如x≈-7.7、x≈-4.5),算法只能在这些邻近的局部最优之间来回跳转,无法突破到全局最优区域。

2. 迭代次数与随机性的限制

你设置的n_iter=100不算多,再加上步长过小,100次迭代的搜索范围非常有限。而且随机算法本身带有运气成分,在小步长下,迭代次数不足时,算法恰好跳到x=0附近的概率极低。

3. 目标函数的局部最优分布特性

你的目标函数f(x)=(x·sin(x)+2x)² = [x(sin(x)+2)]²,由于sin(x)≥-1,所以sin(x)+2≥1,只有x=0时f(x)=0(全局最小值)。但x<0区间内,函数存在多个局部最小值点,这些局部最优的"吸引力"让算法在起始点附近的局部最优区域内停滞,无法跳出。


可行的改进方案

  • 调大跳转步长:手动设置stepsize参数,比如设为5,让随机跳转的范围覆盖到x=0区域:
    ret = basinhopping(f, x0, minimizer_kwargs=minimizer_kwargs, niter=n_iter, stepsize=5)
    
  • 增加迭代次数:将n_iter提升至500或1000,提升算法触及全局最优区域的概率。
  • 移除不必要的@np.vectorize:你的函数本身是标量输入,np.vectorize会额外增加计算开销,直接定义普通函数即可:
    def f(x):
        return (x * np.sin(x) + 2*x) ** 2
    
  • 多起始点搜索:用多个不同的起始点(比如x0=-6、0、1等)分别运行basinhopping,最后取所有结果中的最优值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:09:32