我想根据熊猫数据框中的行迭代地添加到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(节点)创建约束吗?
答案 0 :(得分:1)
尝试将Python列表理解用于求和公式。
考虑到df.coefficient
和model.A
以arc_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
)