0

我正在使用 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。

4

1 回答 1

1

好的,所以我找到了一个可行的解决方案。

可以读取约束并连接一个字符串以获得 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)
于 2016-08-05T18:39:57.593 回答