在CVXPY中动态生成约束列表

时间:2016-08-05 15:14:40

标签: python optimization convex-optimization cvxpy

我正在使用CVXPY处理Python中的最小方差优化问题,该问题以

的形式接受约束
constraints = [
                sum_entries(w) == 1, 
                w[0:5] >0.05,
                w[1] > 0.05,
                w[6] == 0,
                sum_entries(w[country_mappings['France']]) == 0.39,
                w >= 0,positive
                w[country_mappings['France']] > 0.12
             ]

w采用

的形式
w = Variable(n)

为了更有效地运行,我想根据我将存储设置的文件动态创建约束列表。读入和创建约束列表工作正常,并使用

type(constraints) 

显示

<type 'list'>

但是看看它包含的实际条目

[EqConstraint(Expression(AFFINE, UNKNOWN, (1, 1)), Constant(CONSTANT, 
POSITIVE, (1, 1))), LeqConstraint(Constant(CONSTANT, POSITIVE, (1, 
1)), Expression(AFFINE, UNKNOWN, (5, 1))), 
LeqConstraint(Constant(CONSTANT, POSITIVE, (1, 1)), 
Expression(AFFINE, UNKNOWN, (1, 1))), EqConstraint(Expression(AFFINE, 
UNKNOWN, (1, 1)), Constant(CONSTANT, ZERO, (1, 1))), 
EqConstraint(Expression(AFFINE, UNKNOWN, (1, 1)), Constant(CONSTANT, 
POSITIVE, (1, 1))), LeqConstraint(Constant(CONSTANT, ZERO, (1, 1)), 
Variable(10, 1)), LeqConstraint(Constant(CONSTANT, POSITIVE, (1, 1)),
Expression(AFFINE, UNKNOWN, (3L, 1L)))]

而我的是这种格式

['sum_entries(w) == 1', 
 'w[0:5] > 0.05', 
 'w[1] > 0.05', 
 'w[6] == 0', 
 'sum_entries(w[country_mappings['France']]) == 0.39', 
 'w >= 0', 
 'w[country_mappings['France']] > 0.12'
]

用于读取数据的代码是

def read_in_config(filename):
    with open(filename) as f:
        content = f.read().splitlines()
    return content

有谁知道如何做到这一点?问题是在使用CVXPY之前,可以使用CVXPY的变量格式。

1 个答案:

答案 0 :(得分:1)

好的,我找到了一个有效的解决方案。

可以读入约束并连接一个字符串以获得类似

的s.th.
'constraints = [sum_entries(w) == 1,w[0:5] > 0.05,w[1] > 0.05,           
w[6] == 0, sum_entries(w[country_mappings['France']]) == 0.39, 
w >= 0, w[country_mappings['France']] > 0.12 ]'

然后使用

exec 'string from above'

我知道exec不是最安全的选择,但它有效。 W必须在代码中定义

w = Variable(n)