pyomo, создающий ограничения через цикл - PullRequest
0 голосов
/ 27 мая 2019

Я добавляю серию подобных ограничений, по одному для каждого узла (Node_A, Node_B, ... Node_L):

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-индекс в node_arc_matrix относится к столбцу, соответствующему Node_A, а model.NodeVar [1] также относится к Node-A. Вместо того, чтобы создавать ограничение для каждого узла вручную, могу ли я создать ограничения для i (дуги) и j (узлы)?

1 Ответ

2 голосов
/ 27 мая 2019

Не нужно добавлять цикл.

Когда в вашем ограничении есть элементы, которые являются «для всех элементов в ...», Pyomo просто требует, чтобы вы добавили Set s, которые вы хотите перебрать в строке построения Constraint.

model.NodeAConstraint=Constraint(model.set_of_arcs_A, model.set_of_node_N, rule=NodeA)

И ваше правило должно включать a и n в качестве параметров (i, похоже, уже используется в вашей функции).

def NodeA(model, a, n):
    k = sum(
        model.ArcVar[i] * node_arc_matrix[i,a]
        for i in model.ArcVar
    )
    return k ==  2 * model.NodeVar[n]

Обратите внимание, куда я положил a и n в предыдущем коде. Это также должны быть параметры для вашей функции. Я пытался заменить каждый 0 на a и каждый 1 на n, если я правильно понял ваши потребности.

Ссылка на документацию здесь: https://pyomo.readthedocs.io/en/stable/pyomo_modeling_components/Constraints.html

...