簡體   English   中英

cvxpy 打印約束方程后期優化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM