python - 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)
解决方案
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)
推荐阅读
- angular - 如何获得当前值:Angular
- flutter - 使用 cached_network_image 在移动存储中长时间缓存网络图像
- mysql - 日期范围内不存在的 Sql 替代方案
- r - 如何从 R 中的数据框中删除重复和相同的行?
- azure - Azure 媒体播放器多实例卷问题
- node.js - 无法通过 Prom-client 将应用程序数据获取到 prometheus
- javascript - indexedDB 函数返回跨模块的导入/导出
- docker - Nginx 启动失败,没有日志
- javascript - React Native - OnSetGlobal - 承诺?或其他解决方案?
- ios - 如何在 SwiftUI 中为应用程序制作自定义导航栏?