【问题标题】:Setting value of an indexed Variable to an indexed Expression - pyomo将索引变量的值设置为索引表达式 - pyomo
【发布时间】:2017-06-19 22:08:05
【问题描述】:

我正在开发一个需要我使用 python 库进行编码的项目。称为pyomo。

我需要将索引变量的值设置为索引表达式。

所以总共有 2 个模型和 1 个创建它们的实例的脚本。

第一个模型:

m.i = [1,2,3]    # i=1,2,3
m.j = [1,2,3]    # j=1,2,3

m.index = Set(within=m.i*m.j)    # m.index = [i]*[j] (pyomo set)

m.a = Var(m.index)    # m.a[i,j]

m.Exp = Expression(m.index)    # pyomo expression with [i,j] index

m.Const = Constraint(m.index, rule=const_rule)

def const_rule(m, index):
    return m.a[index] == m.Exp[index]

第二个模型:

m.index = ...         # same index with first model's m.index
m.y = Var(m.index)    # lets assume it has values or I can put with init command

run.py 脚本:

instance1 = create_first_model()
instance2 = create_second model()

solve(instance2)

for k in instance1.index:                                    
    instance1.Exp[k].expr = instance2.y[k].value

solve(instance1)

很快:

对于这个 for 循环,我需要一个更好的方法。或更有效的方法(循环很慢......)

问候 奥坎

Ps:所有的 vars、sets、expression 和 constraint 都是 pyomo 对象。

【问题讨论】:

    标签: python for-loop runtime pyomo


    【解决方案1】:

    m.Exp 是包含 Pyomo 变量的表达式,还是您将其用作常量(即可变参数)?

    假设它是一个表达式,并且您想根据 for 循环中的表达式添加一个约束,以下应该可以工作:

    def _linking_con(m, k):
        return m.Exp[k] == value(instance2.y[k])
    instance1.linking_con = Constraint(instance1.index, rule=_linking_con)
    

    如果 m.Exp 是一个常量值,那么我会用一个可变参数替换它

    m.Exp = Param(m.index, mutable=True)
    

    然后将你的 for 循环更改为:

    for k in instance1.index:
        instance1.Exp[k] = value(instance2.y[k])
    

    我认为没有办法避免 for 循环

    【讨论】:

    • 我将它用作相互参数,但我没有这样编码,因为否则求解器不会从该约束中给出任何对偶变量。
    • 另外,如果我将 _linking_con 放在任何模型中,它们将无法工作,因为在调用模型之前未创建实例,因此在调用模型时会出错,类似于 instance2.y[k]不存在。
    • 两个模型都构建好后可以添加约束
    猜你喜欢
    • 2020-04-01
    • 1970-01-01
    • 2018-11-10
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多