gpt4 book ai didi

scipy.optimize.linprog 似乎解决了任务但没有返回 x?

转载 作者:行者123 更新时间:2023-12-01 13:41:49 25 4
gpt4 key购买 nike

我正在尝试使用 scipy.optimize.linprog 来解决一个非常简单的线性程序,并且该函数似乎做了我想要它做的事情,但不知何故它不返回 'x'(它确实返回正确的最小函数值)

仅举一个简单的例子(用 matlab 表示法),我有一个二维 a=[a1; a2] 和简单的线性约束 [1, 2] * a = 1,并希望最小化 a 的 L1 范数。最优应该是a=[0, 0.5]。

据我所知,我可以通过使用一个额外的变量 s 以标准形式制定这个,例如 b>=abs(a)(即 a-b<=0 和 -a-b<=0)并最小化 sum(b ) 受到这些约束和原来的等式约束 [1, 2] * a = 1。

所以我定义 x= [a; b],插入scipy的linprog,成功返回,得到正确答案:sum(b)的最优值为0.5。但是,它返回的 x 充满了 nan 而不是 [0; 0.5; 0; 0.5]

代码如下:

A = np.array([1,2]).reshape([1,2])
b_eq = np.array([1])
ones = np.ones([2,])
zeros = np.zeros([2,])
zerosm = np.zeros([1, 2])
eye = np.eye(2)
c = np.hstack([zeros, ones])
A_ub = np.vstack([np.hstack([eye, -eye]), np.hstack([-eye, -eye])])
b_ub = np.hstack([zeros, zeros])
A_eq = np.hstack([A, zerosm])
res = scipy.optimize.linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=(None, None),
A_eq=A_eq, b_eq=b_eq)

结果:

success: True
status: 0
fun: 0.5
x: array([ nan, nan, nan, nan])
nit: 3
slack: array([ 0., 0., 0., 1.])
message: 'Optimization terminated successfully.'

即x 是 nan 而不是解决方案。函数值是正确的 (0.5),松弛度看起来很好——根据 scipy 文档,松弛度为 0 表示约束处于事件状态,因此第一个和第三个零表示 a1=b1=0,第二个零表示 a2=b2并且它们不为零(否则第 4 个松弛也将为 0)。这再次符合预期,因为 [0, 0.5] 是解决方案。

我做错了什么?这是一个错误吗? (使用 scipy 0.15.1)

谢谢!

最佳答案

显然,您遇到了一个自 0.15.1 版以来已修复的错误。

当我使用 scipy 0.18.0 运行您的代码时,我得到:

In [3]: import scipy.optimize

In [4]: %paste
A = np.array([1,2]).reshape([1,2])
b_eq = np.array([1])
ones = np.ones([2,])
zeros = np.zeros([2,])
zerosm = np.zeros([1, 2])
eye = np.eye(2)
c = np.hstack([zeros, ones])
A_ub = np.vstack([np.hstack([eye, -eye]), np.hstack([-eye, -eye])])
b_ub = np.hstack([zeros, zeros])
A_eq = np.hstack([A, zerosm])
res = scipy.optimize.linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=(None, None),
A_eq=A_eq, b_eq=b_eq)

## -- End pasted text --

In [5]: res
Out[5]:
fun: 0.5
message: 'Optimization terminated successfully.'
nit: 4
slack: array([ 0., 0., 0., 1.])
status: 0
success: True
x: array([ 0. , 0.5, 0. , 0.5])

关于scipy.optimize.linprog 似乎解决了任务但没有返回 x?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39474424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com