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