在CVXPY中:为约束指定名称或ID

时间:2019-12-12 09:04:26

标签: constraints cvxpy

在CVXPY中,我发现可以为定义的变量指定名称或ID。

现在,我还想给一个 string 名称定义的约束,以便以后可以轻松找到它们。 原因是我有很多代理,它们的定义方式相似,但是我想知道哪些约束属于哪个代理。 (因此请为约束条件指定代理的编号)。

我查看了文档,其中Constraint类定义为:

  

cvxpy.constraints.constraint.Constraint(args,constr_id = None)

其中参数定义为

   args (list) – A list of expression trees.

   constr_id (int) – A unique id for the constraint.

所以看来我可以给出一个整数ID,但不能给出一个名字。

有人知道是否可以给约束赋予 string 名称吗?

1 个答案:

答案 0 :(得分:0)

我不知道这是否可行,但我不会尝试深入了解其内部代码。

为什么不把它包起来呢?这样应该更安全且可自定义。

原型(例如,不检查重复项)

import cvxpy as cp

class ConstraintBuilder:
    def __init__(self):
        self.constraintList = []
        self.str2constr = {}

    def addConstr(self, expr, str_):
        self.constraintList.append(expr)
        self.str2constr[str_] = len(self.constraintList)-1

    def get(self):
        return self.constraintList

    def getConstr(self, str_):
        return self.constraintList[self.str2constr[str_]]

####

cb = ConstraintBuilder()

x = cp.Variable(5)

cb.addConstr(x >= 0, 'nonnegative')
cb.addConstr(x[0] + x[1] >= 0.3, 'pair0')
cb.addConstr(x[0] + x[1] >= 0.6, 'pair1')

objective = cp.Minimize(cp.sum(x))
problem = cp.Problem(objective, cb.get())

problem.solve(verbose=True, solver=cp.ECOS)
print(problem.status)

print(cb.getConstr('pair1'))

输出:

ECOS 2.0.7 - (C) embotech GmbH, Zurich Switzerland, 2012-15. Web: www.embotech.com/ECOS

It     pcost       dcost      gap   pres   dres    k/t    mu     step   sigma     IR    |   BT
 0  +3.600e-01  +3.690e-01  +5e+00  7e-01  1e-02  1e+00  8e-01    ---    ---    1  1  - |  -  - 
 1  +4.151e-01  +4.114e-01  +8e-01  2e-01  2e-03  1e-01  1e-01  0.8590  3e-03   1  1  1 |  0  0
 2  +5.863e-01  +5.831e-01  +9e-02  3e-02  2e-04  1e-02  1e-02  0.9795  1e-01   1  1  1 |  0  0
 3  +5.998e-01  +5.998e-01  +1e-03  3e-04  2e-06  1e-04  2e-04  0.9887  1e-04   1  1  1 |  0  0
 4  +6.000e-01  +6.000e-01  +1e-05  3e-06  2e-08  2e-06  2e-06  0.9890  1e-04   1  0  0 |  0  0
 5  +6.000e-01  +6.000e-01  +1e-07  4e-08  2e-10  2e-08  2e-08  0.9890  1e-04   1  0  0 |  0  0
 6  +6.000e-01  +6.000e-01  +1e-09  4e-10  3e-12  2e-10  2e-10  0.9890  1e-04   1  0  0 |  0  0

OPTIMAL (within feastol=4.2e-10, reltol=2.5e-09, abstol=1.5e-09).
Runtime: 0.000236 seconds.

optimal
0.6 <= var0[0] + var0[1]