在 CVXPY 中动态生成约束列表

Dynamically generate list of constraints in 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 的变量格式中获取 w 才能使用。

好的,所以我找到了有效的解决方案。

可以读入约束条件并连接字符串以获得 s.th like

'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)