Python SciPy linprog优化失败,状态为3

时间:2016-12-23 19:58:51

标签: python scipy

尝试使用linprog最小化简单的线性函数。系数是arr2的元素乘以-1。每个变量只有不等式约束,例如-1< = x1< = 1,-2< = x2< = 2等等。

如果选择不在linprog中指定边界:

from scipy.optimize import linprog
import numpy as np
import pandas as pd

numdim = 28

arr1 = np.ones(numdim)
arr1 = - arr1

arr2 = np.array([
19.53,
128.97,
3538,
931.8,
0.1825,
150.88,
10315,
0.8109,
3.9475,
3022,
31.77,
10323,
110.93,
220,
2219.5,
119.2,
703.6,
616,
338,
84.67,
151.13,
111.28,
29.515,
29.67,
158800,
167.15,
0.06802,
1179
])

constr_a = []

for i in range(numdim):

    constr_default = np.zeros(numdim)
    constr_default[i] = 1
    constr_a.append(constr_default)

for i in range(numdim):

    constr_default = np.zeros(numdim)
    constr_default[i] = -1
    constr_a.append(constr_default)

constr_a = np.asarray(constr_a)
constr_b = np.arange(1, 2*numdim + 1, 1)
constr_b[numdim:] = constr_b[:numdim]

print linprog(np.transpose(arr1 * arr2), constr_a, constr_b, bounds=(None, None))

我得到以下结果:

  

有趣:-4327476.2887400016   消息:'优化失败。这个问题似乎没有限制。'   状态:3

我已尝试将最后一行更改为:

print linprog(np.transpose(arr1 * arr2), constr_a, constr_b, bounds=(-1000, 1000))

指定为边界的数字是随机的。输出是:

  

有趣:-4327476.2887400296   消息:'优化已成功终止。'   状态:0

这给我们一个稍微不同的结果和所需的状态。 我的问题是,我是否滥用图书馆以及以何种方式?哪个答案是对的?预计此代码无需指定'界限'参数。我无法使用此参数,因为这些简单约束对于每个变量都是唯一的。

我使用python 2.7和scipy 0.17.1。非常感谢。

UPD

constr_a应该是根据文档(https://docs.scipy.org/doc/scipy/reference/optimize.linprog-simplex.html)的矩阵,并且实际上在代码中。为确保语法正确,我们可以将维数减少到2:

from scipy.optimize import linprog
import numpy as np
import pandas as pd

numdim = 2

arr1 = np.ones(numdim)
arr1 = - arr1

arr2 = np.array([
19.53,
128.97
])

constr_a = []

for i in range(numdim):

    constr_default = np.zeros(numdim)
    constr_default[i] = 1
    constr_a.append(constr_default)

for i in range(numdim):

    constr_default = np.zeros(numdim)
    constr_default[i] = -1
    constr_a.append(constr_default)

constr_a = np.asarray(constr_a)
constr_b = np.arange(1, 2*numdim + 1, 1)
constr_b[numdim:] = constr_b[:numdim]

print constr_a
print constr_b
print linprog(np.transpose(arr1 * arr2), constr_a, constr_b, bounds=(None, None))

这将有效。

1 个答案:

答案 0 :(得分:0)

constr_a列表未正确形成。它是一个数组的数组,而不是一个标量数组。这可能导致不正确的下限导致优化失败。

也许

constr_a.append(constr_default)

应该是

constr_a.append(constr_default[i])

检查两个绑定数组以确保它们具有正确的形式和值。