Как я могу установить двоичную переменную MV на GEKKO? - PullRequest
2 голосов
/ 13 июля 2020

Я выполняю оптимизацию GEKKO, и мне нужно, чтобы одна из переменных (в частности, переменная MV) была двоичной. Я пробовал это:

pheat=m.MV(value=0,lb=0,ub=1,integer=True)

, но в результате переменная все еще имеет непрерывное значение от 0 до 1.

Вот полный код для справки.

from gekko import GEKKO

tf=23 #hours
dis=24 #point in time discretization
o=np.ones(dis)
#initialize model
m=GEKKO()
m.time=np.linspace(0,tf,dis)
#MV variables
pheat=m.MV(value=0,lb=0,ub=1,integer=True)
pheat.STATUS = 1
# Load in data
buy = m.Param(SpotPrices[:dis,country]/10000)    # (c/Wh)
ppv = m.Param(P_AC[:dis,country])                # (W)
qint=m.Param(Q_internal[:dis,country])           # (W)
qwall=m.Param(Qradiation_w[:dis,country])
temp=m.Param(Temperature_data[:dis,country])
walle=m.Param(H_wall_e[:dis,country]*Area_walls)
vent=m.Param(Coeffvent[:dis])
window=m.Param(Area_window*H_window[:dis,country]*1.17)
occ=m.Param(occupancy_profile[:dis])
#Constant values
walli=m.Const(Coeffwall)
bridge=m.Const(0.75*18)
croom=m.Const(2.923E6)
cwall=m.Const(1.055E8)
# Variables
T_int=m.Var(value=20,ub=26)
T_wa=m.Var(value=19)
#equations
m.Equation(T_int.dt() == (walli*(T_wa-T_int)+window*(temp-T_int)+bridge*(temp-T_int)+vent*(temp-T_int)+qint+pheat*1000)*3600/croom )
m.Equation(T_wa.dt() == (walli*(T_int-T_wa)+walle*(temp-T_wa)+qwall)*3600/cwall )       
y = m.if2(occ-1,18,20)
m.Equation(T_int>=y)
m.Obj((pheat*1000-ppv)*buy) # minimize cost

m.options.IMODE = 6  # optimal control
m.solve() # Solve

Спасибо за помощь!

1 Ответ

2 голосов
/ 14 июля 2020

Решателем по умолчанию является IPOPT, и он не дает целочисленного решения. Вместо этого попробуйте решить APOPT.

m.options.SOLVER = 1

Существуют варианты решателя APOPT для смешанных целочисленных задач .

...