Проблема, которую я оптимизирую, - это строительство электростанций в сети передачи. Для этого я размещаю электростанции на каждом автобусе и позволяю оптимизатору подсказать мне, какие из них следует построить, чтобы минимизировать эксплуатационные расходы.
Чтобы смоделировать размещение растения, я попытался использовать массив двоичных переменных, которые будут отмечать, т.е. быть единицей, если растение используется вообще, и 0 в противном случае. Затем в функции Objective для минимизации умножаю этот массив на константу: USEW
.
Я сделал несколько попыток, но не работал. Тот, который, казалось, работал, использовал if2 Gekko
прямо в Obj. func. Однако я получаю действительно странные результаты. Мой код немного длинный, поэтому я опубликую только соответствующие строки, надеюсь, идея будет ясна, если нет, пожалуйста, дайте мне знать, и я публикую все это.
bus=node=24
t=24
Sbase=100.
Gen = 12
VOLL = 10000.
VOLW = 50.
USEW = 100.
Pw = m.Array(m.Var,(bus,t), lb=0., ub=0., value=0.)
for b in range(bus):
m.Minimize( np.sum(VOLL*lsh[b,:] + VOLW*Pc[b,:])*Sbase \
+ m.if2(-1.*Sbase*m.sum(Pw[b,:]),1,0)*USEW )
Проблема в if2
части. Если я удалю его, я получаю ожидаемые результаты, но тогда теряется решение о том, какое растение разместить. Я тоже пробовал с if3
, но тоже не вышло. Из того, что я вижу, похоже, что оптимизатор пытается минимизировать Pw[b,:]
, потому что результат содержит только нули. Как-то миновать if2
часть и попасть во внутреннюю sum
.
Судя по документации, эта часть: m.if2(-1.*Sbase*m.sum(Pw[b,:]),1,0)
должна возвращать 0
или 1
, но не похоже, что это делает. Я умножаю на -1
, потому что Pw
всегда положительно, и я хочу определить, когда Pw>0
.
Мне нужна помощь в том, как правильно использовать условную функцию для этой цели. Спасибо
EDIT1 Рассмотрим следующий случай:
from gekko import GEKKO
m = GEKKO(remote=False)
Sbase=100.
Pw = array([[[0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0],
[0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0],
[0.0], [0.0], [0.0], [0.0], [0.0], [0.0]],
[[10.0], [10.0], [10.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0],
[0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0],
[0.0], [0.0], [0.0], [0.0], [0.0], [0.0]]], dtype=object)
# for np.sum(Pw[0,:])=0.0
print('sum of Pw[0,:]=', np.sum(Pw[0,:]))
print(m.if3(-1.*Sbase*np.sum(Pw[0,:]),1,0).value)
print(m.if3(-1.*Sbase*np.sum(Pw[0,:]),0,1).value)
# for np.sum(Pw[1,:])=30.0
print('sum of Pw[1,:]=', np.sum(Pw[1,:]))
print(m.if3(-1.*Sbase*np.sum(Pw[1,:]),1,0).value)
print(m.if3(-1.*Sbase*np.sum(Pw[1,:]),0,1).value)
Результат всегда один: 0
. Не имеет значения, поменяю ли я местами x1
и x2
или если условие> = 0 или ‹0:
0.0
sum of Pw[0,:]= 0.0
0 #result 1
0 #result 2
sum of Pw[1,:]= 30.0
0 #result 3
0 #result 4