Формулировка ограничения в Pyomo с 3d-индексированными переменными - PullRequest
0 голосов
/ 25 октября 2019

У меня проблема с формулировкой ограничений для трехмерных индексированных переменных с помощью Pyomo: у меня есть следующий список переменных:

1 Var Declarations
E : Size=6, Index=N
    Key       : Lower : Value : Upper : Fixed : Stale : Domain
    (0, 0, 2) :     0 :    10 :  None : False : False : NonNegativeReals
    (0, 0, 3) :     0 :    10 :  None : False : False : NonNegativeReals
    (0, 2, 0) :     0 :    10 :  None : False : False : NonNegativeReals
    (0, 3, 0) :     0 :    10 :  None : False : False : NonNegativeReals
    (1, 3, 1) :     0 :    10 :  None : False : False : NonNegativeReals
    (1, 4, 1) :     0 :    10 :  None : False : False : NonNegativeReals

они по сути являются значениями в трехмерном массиве (2x5x5), который может принимать значение, другоезатем 0. Я пытаюсь оптимизировать их, с некоторыми ограничениями: - сумма значений переменных в строке должна быть максимальной - сумма значений переменных в столбце должна принимать определенное значение

Мой вопросРассмотрено оба ограничения: я попытался сформулировать первое ограничение следующим образом:

def max_perf_rule(model, a, b):                                       
return sum(model.E[a,b,c] for c in range(5) if (a,b,c) in model.N) <= H[a,b]

model.max_perf = Constraint(range(2), range(5), rule = max_perf_rule)    

, где model.N = [(0, 0, 2), (0, 0, 3), (0,2, 0), (0, 3, 0), (1, 3, 1), (1, 4, 1)]

Переменные изначально заданы model.N (список трехмерных кортежей)но мне нужны два "range (2)" и "range (5)" в качестве входных данных в этом ограничении, чтобы иметь возможность ссылаться на соответствующую строку.

Независимо от того, что я пытаюсь, я не могу создатьжелаемые ограничения. Они должны выглядеть примерно так:

max_perf : Size=10, Index=max_perf_index, Active=True
    (0, 0) : E[0,0,2] + E[0,0,3] :      <=  0.0 
    (0, 2) : E[0,2,0] :                 <=  2688.0
    (0, 3) : E[0,3,0] :                 <=  896.0
    (1, 3) : E[1,3,1] :                 <=  448.0 
    (1, 4) : E[1,4,1] :                 <=  9999999.0 

... но я продолжаю получать следующую ошибку:

"ERROR: Constructing component 'max_perf' from data=None failed: ValueError:
Invalid constraint expression. The constraint expression resolved to a
trivial Boolean (True) instead of a Pyomo object. Please modify your rule
to return Constraint.Feasible instead of True.

Error thrown for Constraint 'max_perf[0,1]'"

Я понятия не имею, что это такое;Я даже попытался воспроизвести ситуацию с помощью словаря, а не модели. E, и это сработало.

У вас есть какое-нибудь решение проблемы? Заранее спасибо!

1 Ответ

0 голосов
/ 25 октября 2019

Проблема в том, что при настройке наборов индексации не каждая комбинация диапазона (2) x диапазона (5) x диапазона (5) появляется в model.N. Для некоторых комбинаций sum в правиле ограничения не будет иметь каких-либо терминов и, следовательно, будет иметь постоянное значение 0. Самый простой способ обойти это - добавить проверку в правило ограничения, чтобы убедиться, что сумма непусто:

def max_perf_rule(model, a, b):    
    temp = sum(model.E[a,b,c] for c in range(5) if (a,b,c) in model.N)
    if type(temp) is int:    # This will be true if the sum was empty
        return Constraint.Skip
    return  temp <= H[a,b]
model.max_perf = Constraint(range(2), range(5), rule = max_perf_rule) 
...