Вот один из способов сделать это:
введите двоичную вспомогательную переменную ismax[i] for i in i_TIME
. Эта переменная равна 1, если максимум получается в периоде i
, и 0 в противном случае. Тогда, очевидно, у вас есть ограничение sum(ismax[i] for i in i_TIME) == 1
: максимум должен быть достигнут ровно за один период.
Теперь вам нужно два дополнительных ограничения:
- если
ismax[i] == 0
, то P_GridMax[i] == 0
.
- если
ismax[i] == 1
, то для всех j in i_TIME
должно быть P_GridMax[i] >= P_GridMax[j]
.
Лучший способ сформулировать это - использовать индикаторные ограничения, но я не знаю Pyomo, поэтому не знаю, поддерживает ли он это (полагаю, да, но я не знаю, как их написать). Так что вместо этого я приведу формулировку с большой буквы М.
Для этой формулировки вам нужно определить константу M
, чтобы P_Grid[i]
не мог превышать это значение для любого i
. При этом первое ограничение становится
P_GridMax[i] <= M * ismax[i]
Это ограничение заставляет P_GridMax[i]
равняться 0, если ismax[i] == 1
. Для ismax[i] == 1
это избыточно.
Второе ограничение будет для всех j in i_TIME
P_GridMax[i] + M * (1 - ismax[i]) >= P_Grid[j]
Если ismax[i] == 0
, то левая часть этого ограничения составляет не менее M
, поэтому по определению M
оно будет выполнено независимо от значения P_GridMax[i]
(первые силы ограничения P_Grid[i] == 0
в этом случае). Для ismax[i] == 1
левая часть ограничения становится просто P_GridMax[i]
, именно то, что мы хотим.