首页 > 解决方案 > scipy.optimize.minimize 返回一个不满足问题约束的解决方案。为什么?

问题描述

scipy.optimize.minimize 产生不满足约束的解决方案,但报告说优化成功终止。

目标是 (x[0] - 3)**2 + (x[1] - 2)**2

约束为 x[0]+x[1]<=4

正确的解决方案应该是 [2.5, 1.5]

函数的答案是 [3,2]

我尝试了不同的优化方法。没有尝试任何方法。尝试了语法的变体。

这是代码(看起来超级简单):

import numpy as np
from scipy import optimize

def f(x):
    return (x[0] - 3)**2 + (x[1] - 2)**2

def con(x):
    return sum(x)-4 

x0 = np.array([0, 0])
res=optimize.minimize(f, x0, method="SLSQP",constraints={"fun": con, "type": "ineq"}, options={'disp':True}) 
print(res)
print(sum(res.x)-4)

标签: pythonscipyconstraintsnonlinear-optimization

解决方案


ineq 是 >= 0 的不等式。我假设(基于我看到的例子)它是 <=0 不等式。事实上,下面的代码在纠正了这种误解之后,产生了正确的答案。

从 scipy 导入优化导入 numpy 作为 np

def f(x): 返回 (x[0] - 3)**2 + (x[1] - 2)**2

def con(x):返回 4-sum(x)

x0 = np.array([0, 0]) res=optimize.minimize(f, x0, method="SLSQP",constraints={"fun": con, "type": "ineq"}, options={' disp':True}) print(res) print(sum(res.x)-4)


推荐阅读