#python #optimization
Вопрос:
У меня есть задача оптимизации (простая модель гидроэнергетики) с этими свойствами:
Целевая функция:
Maximize {sum[p(i)*w(i)] vv} for i=(0,24)
Ограничения:
0 <= w(i) <= 16
0 <= V(i) <= 45
Где:
V(i 1) = V(i) - w(i) q
V(0) = 30
vv = 275
q = 3
Вот мой код:
import numpy as np
from scipy.optimize import maximize
n=24
p=[280.91, 280.3, 279.48, 278.25, 276.81, 274.66, 271.89, 276.91, 274.45, 277.22, 276.91, 275.99, 271.59, 267.49, 265.95, 268.31, 271.28, 276.2, 276.91, 277.02, 276.4, 276.81, 274.45, 271.59]
w=[]*n
q=3 #inflow
vv = 270 #water value
Pmaks = 16 #max production
Vmaks = 45 #reservoir volume
def objective(p,w): #benefit function
benefit = 0
for i in range(n):
benefit = p[i]*w[i]
return benefit vv
def constraint(V,w): #eq
return V[i 1] - V[i] w[i] q
# initial guesses
V[0] = 30
w[0] = 5
# show initial objective
print('Initial Objective: ', w[0]))
# optimize
a = (0.0, Pmaks)
b = (0.0, Vmaks)
bnd1 = (a)
bnd2 = (b)
con = ('type': 'eq', 'fun': constraint) #<----- HERE I GOT ERROR ON THE FIRST ":"
cons = ([con])
solution = maximize(objective, w[0], method='LP', bounds=[bnd1,bnd2], constraints=cons)
w = solution.w
# show final objective
print('Final Objective: ',w)
# print solution
print('Solution')
print('Production: ', w)
print('Reservoir: ', V)
Как вы можете видеть, я получаю ошибку на «con1». Кто-нибудь знает, почему? И есть ли у кого-нибудь отзывы о том, как улучшить код?
Комментарии:
1. Существует множество примеров, которые охватывают проблемы индексированной оптимизации. Вы смотрели какие-либо примеры или, еще лучше, вводный текст по линейному программированию? Просмотрите пару из них и примеры на SO. Избегать
numpy
. Посмотрите на другиеpulp
примеры. Вы на правильном пути.