![](/img/trans.png)
[英]Cvxpy portfolio optimization with constraint on the maximum number of assets
[英]cvxpy print constraint equation post optimization
我可能有一个非常简单的问题,但我在网上找不到答案。 我有一个有很多约束的优化问题。 因此,当解决方案不可行时,我会遍历每个约束以探索可能出了什么问题。 我需要做的一件事就是简单地打印每个约束的实际方程。 例如:
x1 = cvx.Variable(5)
y1 = cvx.Variable(5)
ones_vector = np.ones((5))*1.0
zeros_vect = np.zeros((5))
cons1 = x1 >= (ones_vector-zeros_vect )
cons2 = y1 >= ones_vector
k = np.ones((5))*(-4)
cons3 = (x1 + y1) <= k
list_cons = [cons1, cons2, cons3]
obj_func = ones_vector.T @ (x1+y1)
prob = cvx.Problem(cvx.Minimize(obj_func), list_cons )
p.solve()
for cons in list_cons:
print(cons)
最后一个循环将约束打印到标准输出。 打印 cons1 时,我的期望(需要)是看到:“x1 >= (ones_vector-zeros_vect)”。 但是,它会打印以下内容“[1. 1. 1. 1. 1.] <= var2186”。 这显然是一个简单的例子,constraint1 的右侧是一个向量减去一个零向量。 在我的实际问题中,这些表达式更大更复杂,因此显示实际值对我来说毫无用处。 有人知道我如何打印实际的表达式语法“x1 >= (ones_vector-zeros_vect)”吗? 谢谢
在减去数组之前,您必须向 CVXPY 指示表达式结构。 我做了:
import cvxpy as cvx
import numpy as np
x1 = cvx.Variable(5)
y1 = cvx.Variable(5)
ones_vector = np.ones((5))*1.0
zeros_vect = np.zeros((5))
cons1 = x1 >= (cvx.Constant(ones_vector)-cvx.Constant(zeros_vect) )
print(cons1)
并得到
[1. 1. 1. 1. 1.] + -[0. 0. 0. 0. 0.] <= var0
我不知道是否可以进一步减少以避免打印值。 它可以用参数来完成,因为它们和变量一样,可以命名:
import cvxpy as cvx
import numpy as np
x1 = cvx.Variable(100, name="xx")
y1 = cvx.Variable(100)
p1 = cvx.Parameter(100, name="pp")
p2 = cvx.Parameter(100, name="qq")
p1.value = np.ones((100))*1.0
p2.value = np.zeros((100))
cons1 = x1 >= (p1-p2 )
print(cons1)
印刷:
pp + -qq <= xx
另请注意,大多数求解器都有一些选项,允许以或多或少的标准文本格式打印他们实际收到的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.