![](/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.