0

我正在尝试简单的实验来学习 scipy 的 SLSQP 优化器。

我采用了以下功能:

def obj(x):
    return -1*((x[0]*x[0])+(x[1]*x[1]))

这是雅可比的:

def jacj(x):
    return [-2*x[0],-2*x[1]]

它的界限为:

bounds=[(0,1),(0,1)]

一个简单的约束——x[0]+2*x[1]<=1:

cons2=({'type':'ineq',
         'fun':lambda x: np.array([-(x[0])-2*(x[1])+1]),
          'jac':lambda x: np.array([-1.0,-2.0])})

现在我尝试初始猜测 x0=[.1,0.01]

res=minimize(obj,x0,method='slsqp',jac=jacj,bounds=bounds,
    constraints=cons2,options={'maxiter':100,'ftol':0.000001,'eps':1.0e-08})

当我运行它时,我得到的解决方案是:x[0]=1,x[1]=0 and obj=-1

但是当我以 x0=[0.001,0.01] 的初始猜测开始时,我得到的解决方案是:x[0]=0,x[1]=0.5 和 obj=0.25

为什么在后面的运行中没有给出最佳解决方案?它是如何工作的?

4

1 回答 1

0

最大化平方和函数是非凸的。求解器通常会收敛到局部最优值。为了保证最佳解决方案,您需要使用全局求解器。

请注意,最小化平方和目标更容易:这是凸的。在这种情况下,求解器将始终(嗯,除了不可行和数值问题)收敛到全局最优值。

于 2019-09-20T18:16:47.270 回答