Pyomo 和动态 objective 函数创建

Pyomo and dynamic objective function creation

我想根据 pandas 数据框中的行迭代添加到 Pyomo objective 函数。我根据数据框的大小创建了变量:

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

其中 arc_decvars 是与对应的 pandas 数据帧系列顺序相同的列表。

我想做的是像这样创建一个 objective 函数,但不必在代码中明确指定索引:

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(节点)创建约束,而不是手动为每个节点创建约束吗?

尝试在求和公式中使用 Python 列表理解。

考虑到 df.coefficientmodel.Aarc_decvars 作为域并且 arc_decvars 在 Pyomo Set 中,您可以创建您的 objective 以这种方式运行:

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