我正在尝试简单的实验来学习 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
为什么在后面的运行中没有给出最佳解决方案?它是如何工作的?