Python cvxpy中一个极小化问题的求解

Python cvxpy中一个极小化问题的求解,python,solver,cvxpy,Python,Solver,Cvxpy,我有一个线性优化问题,可以用成本函数代码表示,如下所示: value_to_minimize = 0.0; for i in range(0, len(v_1)): value_to_minimize += np.abs(v_1[i] - (v_2[i] * c1 + v_3[i] * c2 + v_4[i] * c3)); 解算器的任务应该是找到变量c1、c2、c3的值,这些变量使值最小化。作为边界条件,c1,c2,c3一起应产生1.0,而不是负值。 v_1、v_2、v_3和v_4是

我有一个线性优化问题,可以用成本函数代码表示,如下所示:

value_to_minimize = 0.0;
for i in range(0, len(v_1)):
    value_to_minimize += np.abs(v_1[i] - (v_2[i] * c1 + v_3[i] * c2 + v_4[i] * c3));
解算器的任务应该是找到变量
c1
c2
c3
的值,这些变量使值最小化。作为边界条件,
c1
c2
c3
一起应产生1.0,而不是负值。
v_1
v_2
v_3
v_4
是具有10000个浮点值的向量

以下是在cvxpy中解决此最小化问题的概要,但在cp.Minimize(…)中没有参数传递:


在这种情况下,cvxpy的最小化函数看起来如何?

我强烈建议删除其中一个参数和一个约束。如果您知道
c1+c2+c3=1.
,则使用
c3=1.-c1-c2
!这使得最小化的任务更加容易。另外,如果
v_1
等是numpy数组,则将其用作数组,例如

c3=1c1-c2
值_to_minimize=np.sum(np.abs(v_1-(v_2*c1+v_3*c2+v_4*c3)))

如果您不介意使用另一个库,我建议您使用
scipy

from scipy.optimize import minimize
import numpy as np

def OF(x0, v_1, v_2, v_3, v_4):
  value_to_minimize = 0.0
  for i in range(0, len(v_1)):
    value_to_minimize += np.abs(v_1[i] - (v_2[i] * x0[0] + v_3[i] * x0[1] + v_4[i] * x0[2]))
  return value_to_minimize


if __name__ == '__main__':

  x0 = np.array([0, 0, 0])
  v_1 = np.random.randint(10, size = 10000)
  v_2 = np.random.randint(10, size = 10000)
  v_3 = np.random.randint(10, size = 10000)
  v_4 = np.random.randint(10, size = 10000)


  minx0 = np.repeat(0, [len(x0)] , axis = 0)
  maxx0 = np.repeat(np.inf, [len(x0)] , axis = 0)
  bounds = tuple(zip(minx0, maxx0))

  cons = {'type':'eq', 
  'fun':lambda x0: 1 - sum(x0)}
  res_cons = minimize(OF, x0, (v_1, v_2, v_3, v_4), bounds = bounds, constraints=cons, method='SLSQP')



  print(res_cons)
  print('Current value of objective function: ' + str(res_cons['fun']))
  print('Current value of controls:')
  print(res_cons['x'])
输出为:

     fun: 27919.666908810435
     jac: array([5092.        , 5672.        , 5108.39868164])
 message: 'Optimization terminated successfully.'
    nfev: 126
     nit: 21
    njev: 21
  status: 0
 success: True
       x: array([0.33333287, 0.33333368, 0.33333345])
Current value of objective function: 27919.666908810435
Current value of controls:
[0.33333287 0.33333368 0.33333345]
但是很明显,这里的实际值并没有太大意义,因为我只是对
v\u
值使用了随机整数。。。这只是一个演示,说明此模型将满足
c
值加1和边界不小于零(负值)的约束

编辑更新:没有仔细查看OF/约束,从而意识到这是一个线性问题。。。应该使用线性解算器算法(尽管,您可以使用非线性解算器,但这太过分了)

scipy
的线性解算器对于像这样的复杂优化问题不是很好,返回到
cvxpy

import numpy as np
import cvxpy as cp

# Create two scalar optimization variables.
x = cp.Variable()
y = cp.Variable()
z = cp.Variable()

v_1 = np.random.randint(10, size = 10000)
v_2 = np.random.randint(10, size = 10000)
v_3 = np.random.randint(10, size = 10000)
v_4 = np.random.randint(10, size = 10000)

constraints = [x + y + z == 1, x >= 0, y >= 0, z >= 0]

objective = cp.Minimize(cp.sum(cp.abs(v_1 - (v_2 * x + v_3 * y + v_4 * z))))

prob = cp.Problem(objective, constraints)
print("Value of OF:", prob.solve())
print('Current value of controls:')
print(x.value, y.value, z.value)
输出:

Value of OF: 27621.999978414093
Current value of controls:
0.3333333333016109 0.33333333406414983 0.3333333326298208

(1) 什么价值观是错误的,以什么方式?(2) 请确保可以复制这些内容。@ErwinKalvelagen谢谢您的回复。
c
变量中的三个值不包含最佳值,因为我可以通过反复试验找到更好的值。在这种情况下,再现性不是那么容易实现的,估计是否
cp.pnorm(u-cp.sum(V@c),1))
真的做了我想做的事情,这会对我有所帮助。如果没有一小段代码重现问题(),我不知道我能帮上什么忙。@ErwinKalvelagen非常感谢。我现在编辑了这个问题,使它更开放。顺便说一句。为什么要使用这个特定的库?这似乎是一个相对简单的线性优化问题。c3的简化似乎合乎逻辑,谢谢。您将如何解决最小化问题?使用另一个库?非常感谢您提供的解决方案,它非常有效。然而,我已经看到SLSQP是一个非线性解算器,而我的问题是一个线性状态空间。我能在一篇科学论文中被批评吗?@MerklT啊,我没有读过你的函数,是的,你应该用线性求解器来解决线性问题。。你不会因为SLSQP而受到批评。。但你可能会看到一些,因为它有点过分了。我发布了一个更新!
Value of OF: 27621.999978414093
Current value of controls:
0.3333333333016109 0.33333333406414983 0.3333333326298208