У меня есть следующая проблема оптимизации:
Где X
и q
являются эндогенными, тогда как другие переменные известны.
Я использую функцию минимизации scipy для ее решения. У меня нет проблем с границами и ограничениями:
# objective function
def objective(q,s):
return -sumprod(q,s)
def sumprod(l1,l2):
return sum([x*y for x,y in zip(*[l1,l2])])
# constraints
def cons_periodicflow_min(q):
return q.sum()-qpmin
con1 = {'type':'ineq','fun':cons_periodicflow_min}
def cons_periodicflow_max(q):
return qpmax - q.sum()
con2 = {'type':'ineq','fun':cons_periodicflow_max}
def cons_daily_reservoir(q):#xmin,q,X,a,delta):
return X+a-q-delta-xmin
con3 = {'type':'ineq','fun':cons_daily_reservoir}
def cons_end_reservoir(q):#xend,q,X,a,delta):
return X[-1]+a[-1]-q[-1]-delta[-1]-xend
con4 = {'type':'ineq','fun':cons_end_reservoir}
cons=[con1,con2,con3,con4]
# definition of the parameters
T=3
q0 = np.zeros(T)
s0 = np.array([10,10,10])
qmin = [0,0,0]
qmax = [10,10,10]
delta = [1,1,1]
a = [2,2,2]
X = [10,0,0]
qpmax = 50
qpmin=10
b = [(qmin[t],qmax[t]) for t in range(T)]
sol = sco.minimize(objective,q0,bounds=b,constraints=cons)
Моя единственная проблема в том, что X
зависит от q
, поэтому мне нужно обновлять X на каждом временном шаге, могу ли я добавить его в функцию минимизации? Иначе как это сделать?
EDIT:
Я могу выразить X
следующим образом (пожалуйста, не обращайте внимания на проблемы t / t + 1):
Поэтому ограничение с Xmin
может переписать:
Помогает ли это выразить проблему оптимизации?