全局最优点basinhopping
常规的最优化算法很容易陷入局部极值点。basinhopping算法是一个寻找全局最优点的算法。
scipy.optimize.basinhopping(func, 
                            x0, niter=100, 
                            T=1.0, stepsize=0.5,   
                            minimizer_kwargs=None,
                            take_step=None, 
                            accept_test=None, 
                            callback=None,   
                            interval=50, 
                            disp=False, 
                            niter_success=None)
func:可调用函数。为待优化的目标函数。最开始的参数是待优化的自变量;后面的参数由minimizer_kwargs字典给出x0:一个向量,设定迭代的初始值niter:一个整数,指定迭代次数T:一个浮点数,设定了“温度”参数。stepsize:一个浮点数,指定了步长minimizer_kwargs:一个字典,给出了传递给scipy.optimize.minimize的额外的关键字参数。take_step:一个可调用对象,给出了游走策略accept_step:一个可调用对象,用于判断是否接受这一步callback:一个可调用对象,每当有一个极值点找到时,被调用interval:一个整数,指定stepsize被更新的频率disp:一个布尔值,如果为True,则打印状态信息niter_success:一个整数。Stop the run if the global minimum candidate remains the same for this number of iterations.
返回值:一个OptimizeResult对象。其重要属性为:
x:最优解向量success:一个布尔值,表示是否优化成功message:描述了迭代终止的原因
基本使用
假设我们要求解最小值的函数为: 于是有:
  def fun(p):
    x,y=p.tolist()#p 为数组,形状为 (2,)
    return f(x,y)
案例 1
求解函数: 的最小值。
import numpy as np
from scipy import optimize as opt
def func(p):
    x, y = p
    return (1-x)**2 + 100*(y-x**2)**2
result = opt.basinhopping(func,x0=np.array([10,10]))
result
结果:
                        fun: 6.098906415928738e-13
 lowest_optimization_result:       fun: 6.098906415928738e-13
 hess_inv: array([[0.50162481, 1.0026807 ],
       [1.0026807 , 2.00930225]])
      jac: array([ 2.91012054e-05, -1.05691264e-05])
  message: 'Desired error not necessarily achieved due to precision loss.'
     nfev: 444
      nit: 16
     njev: 108
   status: 2
  success: False
        x: array([0.9999995 , 0.99999895])
                    message: ['requested number of basinhopping iterations completed successfully']
      minimization_failures: 30
                       nfev: 17153
                        nit: 100
                       njev: 4199
                          x: array([0.9999995 , 0.99999895])