#arrays #python-3.x #optimization #minimize
Вопрос:
На рисунке вы можете увидеть общую формулировку проблемы. Это интеграл, который интегрируется по своей верхней границе. Это означает, что нам нужно найти t, которое максимизирует площадь выше x, и t, которое максимизирует площадь ниже x.
Мы хотим свести к минимуму расстояние между этими областями и емкостью аккумулятора Cbatt. Таким образом, Cbat используется как можно чаще. Эта ошибка называется f(x) и должна быть сведена к минимуму.
Для моей проблемы у меня нет функции над t, но фрейм данных с 70 000 строк, где каждая строка (t) представляет собой новый временной шаг.
Для уровня x мы должны выполнить итерацию через фиксированное окно уровней нагрузки.
Мой код таков:
hist = np.array(df.iloc[:,0]) #i created an array to make it more efficient
Big_M = 1000000000
def L(j):
return hist[j]
def Integral(t, x):
sum = 0
for i in range(t 1):
sum = sum (L(i) - x)/4 # quater hours --> kW * 1/4 h = kWh * 1/4
return sum
def calc_integral(time_window, x):
min_t, max_t = 0,0
max_integral, min_integral = -Big_M, Big_M
for t in range(time_window):
if Integral(t, x) < min_integral:
min_integral = Integral(t, x)
min_t = t
if Integral(t, x) > max_integral:
max_integral = Integral(t, x)
max_t = t
return max_integral, min_integral
def error(Cbatt, time_window, x):
max_integral, min_integral = calc_integral(time_window, x)
return abs(Cbatt - max_integral - min_integral)
def threshold(Cbatt, time_window):
L_max = int(round(hist[0:time_window].max(), 0))-1
L_min = int(round(hist[0:time_window].min(), 0))
smallest_error = Big_M
best_shave_level = 0
for x in range(L_min,L_max):
if error(Cbatt, time_window, x) < smallest_error:
smallest_error = error(Cbatt, time_window, x)
best_shave_level = x
return best_shave_level, smallest_error
def BES(time_window, Cbatt_min, Cbatt_max):
smallest_error = Big_M
best_Cbatt = 0
for Cbatt in range(Cbatt_min,Cbatt_max):
if threshold(Cbatt, time_window)[1] < smallest_error:
smallest_error = threshold(Cbatt, time_window)[1]
best_shave_level = threshold(Cbatt, time_window)[0]
best_Cbatt = Cbatt
return best_shave_level, smallest_error, best_Cbatt
В основном этот код перебирает все данные, и это занимает много времени. Есть ли какой-нибудь способ сделать это намного более эффективным? Существует ли пакет оптимизации, который принимает в качестве переменной что-то вроде номера строки (или расположения массива)?
Большое спасибо!