使用持久性求解器处理ConstraintList

时间:2018-11-12 20:51:51

标签: pyomo

我想尝试对算法使用持久性求解器,该算法会反复为问题添加新的约束,并且希望避免在每次迭代之前完全重建提供给求解器的文件。

在按照https://pyomo.readthedocs.io/en/stable/solvers/persistent_solvers.html中所述使用持久性求解器之前,我使用了ConstraintList对象来迭代地添加新约束,而不必分别命名它们。我认为这是一个非常优雅的解决方案,我想看看是否有一种方法可以在向ConstraintList添加新约束时通知持久性求解器。

在文档中写道

m.c2 = pe.Constraint(expr=m.y >= m.x)  
opt.add_constraint(m.c2) 

其中m.c2是要使用持久性求解器添加到模型的约束。一旦在其中添加了约束,通知持久性求解器ConstraintList发生更改的等效行是什么?

1 个答案:

答案 0 :(得分:0)

这是您创建约束列表的方式

const fieldDefinition = {
    name: 'nestedColumn',
    type: 'RECORD',
    mode: 'REPEATED',
    fields: [
        {name: 'id', type: 'INTEGER', mode: 'NULLABLE'},
        {name: 'amount', type: 'INTEGER', mode: 'NULLABLE'},
    ],
}; 

const table = bigQuery.dataset('dataset1').table('source_table_name');
const metaDataResult = await table.getMetadata();
const metaData = metaDataResult[0];

const fields = metaData.schema.fields;
fields.push(fieldDefinition);

await table.setMetadata({schema: {fields}});

然后您可以在约束列表中添加约束:

m.Cut_Defn = pyomo.ConstraintList(noruleinit=True)

如果您在m.Cut_Defn.add(some_number >= your_variable + some_other_number) 之前求解,那么除了在.add()之后求解之外,还会找到其他解决方案。因此,您可以这样认为:它要动态实现新的约束,如果要在优化中考虑这些约束,则必须解析模型。