繁体   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