Pyomo и создание динамической целевой функции - PullRequest
0 голосов
/ 26 мая 2019

Я хочу итеративно добавить к целевой функции Pyomo основанную на строках в кадре данных pandas.Я создал переменные, основанные на размере кадра данных:

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

, где arc_decvars - это список в том же порядке, что и соответствующий ряд данных pandas.

Я хотел бы создать такую ​​целевую функцию, но без необходимости явно указывать индексы в коде:

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)

Где 0-index в node_arc_matrixссылается на столбец, соответствующий Node_A.Вместо того, чтобы создавать константу для каждого узла вручную, могу ли я создать ограничения как для i (дуги), так и для j (узлы)?

1 Ответ

1 голос
/ 27 мая 2019

Попробуйте использовать понимание списка 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
)
...