Как использовать Scipy свести к минимуму, когда ограничения являются динамическими? - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть следующая проблема оптимизации:

enter image description here Где 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):

enter image description here

Поэтому ограничение с Xmin может переписать:

enter image description here

Помогает ли это выразить проблему оптимизации?

...