pyomo和动态目标函数的创建

时间:2019-05-26 13:38:35

标签: pyomo

我想根据熊猫数据框中的行迭代地添加到Pyomo目标函数中。我已经根据数据框的大小创建了变量:

model.A = Var(range(0,len(arc_decvars)), initialize=0,within=Integers,bounds=(0,5))

其中arc_decvars是一个列表,其顺序与相应的熊猫数据框系列相同。

我想做的是创建一个这样的目标函数,但不必在代码中显式指定索引:

model.ObjFcn = ( df.coefficient[0] * model.A[0] * ( 1- df.coefficient[0] * model.A[0]) ) + ( df.coefficient[1] * model.A[1] * ( 1- df.coefficient[1] * model.A[1]) +...+ ( df.coefficient[999] * model.A[999] * ( 1- df.coefficient[999] * model.A[999]) )

关于如何执行此操作的任何想法?

----后续行动:

我正在添加一系列这样的约束,每个节点一个:

def NodeA(model):
    k = sum(
        model.ArcVar[i] * node_arc_matrix[i,0]
        for i in model.ArcVar
            )
    return k ==  2*model.NodeVar[1]
model.NodeAConstraint=Constraint(rule=NodeA)

其中node_arc_matrix中的0索引是指与Node_A对应的列。除了可以为每个节点手动创建约束之外,我还可以跨i(弧)和j(节点)创建约束吗?

1 个答案:

答案 0 :(得分:1)

尝试将Python列表理解用于求和公式。

考虑到df.coefficientmodel.Aarc_decvars为域,并且arc_decvars在Pyomo Set中,您可以通过以下方式创建目标函数:

model.ObjFcn = sum(
    df.coefficient[i] * model.A[i] * ( 1- df.coefficient[i] * model.A[i])
    for i in model.arc_devcars
)