在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 名称吗?
答案 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]