【问题标题】:Pyomo update Set and Var to solve againPyomo 更新 Set 和 Var 再次解决
【发布时间】:2020-07-04 04:23:05
【问题描述】:

我对 Pyomo 很陌生,但对 Python 不熟悉。

我有以下问题:

import pyomo.environ as pyo

model = pyo.ConcreteModel()
model.A = pyo.Set(initialize=range(7))
model.B = pyo.Set(initialize=range(7))
model.AB = pyo.Set(initilize= list((a,b) for a in model.A for b in model.B)
model.X = pyo.Var(model.A, model.B, within=pyo.Binary)
model.objective = pyo.Objective(... maximize)
solver = pyo.SolverFactory('glpk')
result = solver.solve(model)

接下来我想更新 model.B Set() 并修改 de model.AB Set 和 model.X Var,这样我就可以再次解决它。比如我想设置:

model.B = pyo.Set(initialize=range(4)

然后更新model.AB、model.X并再次求解。如果手动完成:

model.B = pyo.Set(initialize=range(4)
model.AB = pyo.Set(initilize= list((a,b) for a in model.A for b in model.B)
model.X = pyo.Var(model.A, model.B, within=pyo.Binary)
result = solver.solve(model)

这不起作用,它给出了以下错误:

RuntimeError: Cannot add component 'X_index' (type <class 'pyomo.core.base.sets._SetProduct'>) to block 'unknown': a component by that name (type <class 'pyomo.core.base.sets._SetProduct'>) is already defined.

【问题讨论】:

    标签: python python-3.x pyomo


    【解决方案1】:

    基本上,您需要先删除变量及其索引,然后再重新创建它。套装也是如此。

    因此,本质上,您需要在重新定义新组件之前添加以下几行:

    model.del_component(model.B)
    model.del_component(model.AB)
    model.del_component(model.X)
    model.del_component(model.X_index)
    

    然后你可以继续重新定义它们:

    model.B = pyo.Set(initialize=range(4)
    model.AB = pyo.Set(initialize= list((a,b) for a in model.A for b in model.B))
    model.X = pyo.Var(model.A, model.B, within=pyo.Binary)
    

    【讨论】:

    • 或者你只是使用一个函数来定义你的模型,并带有一个表示model.B长度的参数。这是因为我无法弄清楚为什么您要在解决它之前重新定义一个集合。所以只需使用一个接受一个参数的函数并循环求解语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2017-02-17
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多