首页 文章

将索引变量的值设置为索引表达式 - pyomo

提问于
浏览
0

我正在开发一个项目,要求我使用python lib进行编码 . 叫做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循环 . 或者更有效的方法(循环很慢......)

关心Okan

Ps:所有的变量,集合,表达式和约束都是pyomo对象 .

1 回答

  • 0

    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是一个常数值,那么我会用一个可变的Param替换它

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

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

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

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

相关问题