如何将外部数据传递到Pyomo约束规则



在Pyomo中构建约束或约束列表的经典方法是使用规则

例如

def ConSatisfyDemand(model,p):
return sum(model.OutQty[pl,r] for (pl,r) in model.OutputTypeIndex if pl==p) == DemandQty[p]

然而,如果DemandQty是外部数据,例如Pandas系列,则需要以某种方式将其传递给函数或声明为全局数据才能在范围内。根据"为什么Pyomo行为在将参数传递给约束函数时发生变化",似乎没有任何方便的方法来实现前者?

全局声明在脚本中是可以的,但在生产应用程序中是不可取的。

另一种选择是将DemandQty数据作为参数加载到模型中,以便访问它。但这可能无法扩展性能,并且仅为Pyomo维护第二个数据副本可能会很尴尬。有没有办法在约束规则函数中访问这些"外部数据"?

一种选择可能是将约束嵌套在另一个函数中:

from pyomo.environ import (ConcreteModel, Constraint, Var, Set)
m = ConcreteModel()
m.v = Var()
cities = ['Chicago', 'Dallas']
m.cities = Set(initialize = cities)
DemandQty = {'Chicago': 20, 'Dallas': 40}  # External dict, could be pandas object
def nested_rule(m, external_obj):

def demand_rule(m, city):
return m.v == external_obj[city]
m.nested_con = Constraint(m.cities, rule=demand_rule)

return 
nested_rule(m, DemandQty)

通过这种方式,约束仍然可以访问DemandQty,但仅在nested_rule内。如果您想要写入多个需要访问外部数据的Constraint,这也可能是有利的。

注意:这里,m.cities是在模型内部初始化的集合。否则,CCD_ 5也将需要被传递到CCD_ 6。

最新更新