добавление ограничения в среде pyomo

Я работаю под пакетом pyomo.environ. Я попытался добавить ограничение примерно так: https://imgur.com/a/pWJ79. я и j являются индексом узлов.

node_set содержит от N0 до N5, всего шесть узлов. Arc_set — это набор, в котором хранятся связи между узлами, скажем, [N1, N2], и он не содержит ни одной дуги собственной петли, скажем, [N1, N1]. Набор F содержит [F1, F2, F3]

Итак, я сделал что-то вроде этого:

def c1_rule(m, j):
    return sum(m.X[e[0], j, f] for e in m.arc_set if e[1] != 'N0' for f in m.f_set) == 1
m.c1_cons = pe.Constraint(m.node_set, rule= c1_rule)

Однако я понял, что это вызовет ошибки, когда мой j равен i, что здесь равно e[0], поскольку индекс m.X[i, j, k] не имеет что-то вроде [N1, N1, F1] . У меня есть одна идея, что добавить дуги собственной петли к набору дуг. Есть ли другой способ избежать этой ошибки?


person whh1294    schedule 08.12.2016    source источник


Ответы (1)


Во-первых, предупреждение: показанное вами ограничение предполагает, что X[i,j,f] существует для всех i и j:

ограничение

В противном случае это было бы описано примерно так:

ограничения

Итак, если вы строго следуете этому ограничению, ваш код правильный, вам просто нужно убедиться, что все записи (в том числе когда i == j) для параметра/переменной X существуют.


Теперь вы получаете сообщение об ошибке, потому что ваше правило ограничения создается для всех j и f независимо от того, что находится в arc_set.

Вот и получается, что если у вас [N1, N2] в arc_set, то переменная e будет равна [N1, N2] а при j = N1 и f = F1 действует следующее правило:

m.X[e[0], j, f]

будет переведено на:

m.X[N1, N1, F1]

Это может вызвать ошибки, если X является параметром вашей модели, а запись X[N1, N1, F1] не существует.

Это можно исправить, включив e[0] != j в понимание списка для правила ограничения:

def c1_rule(m, j):
    return sum(m.X[e[0], j, f] for e in m.arc_set for f in m.f_set
                               if e[1] != 'N0' and e[0] != j) == 1
m.c1_cons = pe.Constraint(m.node_set, rule= c1_rule)
person Jon Cardoso    schedule 08.12.2016