尝试使用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))
这将有效。
答案 0 :(得分:0)
constr_a
列表未正确形成。它是一个数组的数组,而不是一个标量数组。这可能导致不正确的下限导致优化失败。
也许
constr_a.append(constr_default)
应该是
constr_a.append(constr_default[i])
检查两个绑定数组以确保它们具有正确的形式和值。