【问题标题】:Dynamically generate list of constraints in CVXPY在 CVXPY 中动态生成约束列表
【发布时间】:2016-08-05 15:14:40
【问题描述】:

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

【问题讨论】:

  • (1) 你没有展示负责读/写的代码。也许你应该。 (2) 实际的条目实际上正是您制定的。这是内部表示。 (3) 这些约束/内部表示可能取决于变量对象,所以我希望你也保存它们。如果您使用了 pickle,可能会自动获取。 (4) 告诉更多关于你实际尝试做的事情?阅读约束后替换 w ? [cvxpy](www.cvxpy.org) 支持参数来做类似的事情。其他可能的方法都是基于python的eval,很吓人!
  • 1.) 我添加了读取数据的代码。 2.) 如何将字符串列表元素转换为 CVXOPT 变量的问题? 4.)我正在解决一个最小方差问题,w 是一个权重向量,它告诉我股票的最佳比例,所有权重加起来为 1。希望能更清楚地说明我想要做什么
  • 这看起来很有趣,你是在这样阅读你的约束吗?我敢肯定你会用泡菜。所以我仍然没有得到所有的分数。我想你想建立你的约束一次,读入约束,选择 w 并解决。那么你为什么要这样做呢?任何真正的原因(而不是仅仅根据给定的 w 制定问题)?根据 w 的性质,不会有真正的加速。而且您肯定应该更改您的文本,因为在我看来您使用的是 cvxpy(它在内部使用 cvxopt),而不是 cvxopt。这让我抓狂!
  • 不涉及泡菜我想这样做的原因是因为我正在运行的每个案例的约束都会改变,我不想在源代码中更改它们。我改了标题你是对的我使用cvxpy
  • 我在这里看不到用例。也许是因为误解,但也许你对如何做这些事情有一些不同的看法。只需像您所做的那样制定您的问题,但这次使用 cvxpy 的 parameter 作为 w 向量。然后,对于每次运行,将 w 参数替换为新的 w 向量。 备注:这个w[0:5] &gt;0.05, w[1] &gt; 0.05没有意义。

标签: python optimization convex-optimization cvxpy


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    相关资源
    最近更新 更多