В python есть много библиотек, посвященных численной оптимизации.Я бы порекомендовал scipy.optimize
для более простых задач, таких как та, о которой вы говорите, и pyomo
для более сложных задач оптимизации.
Тип задачи
Давайте посмотрим наscipy.optimize
.Во-первых, вам нужно знать, является ли ваша проблема оптимизации выпуклой или невыпуклой . Выпуклый в основном означает, что существует только один локальный минимум, который мы хотим найти. Невыпуклые задачи могут иметь несколько локальных минимумов, в которых могут застрять алгоритмы оптимизации.
Выпуклые задачи
Для выпуклых задач мы можем простосм. scipy.optimize.minimize
.Требуется функция f(x)
, которую мы хотим минимизировать, а также начальное значение x0
и (если доступно) границы переменных.
Простой пример:
from math import inf
import numpy as np
from scipy.optimize import minimize
def func(x):
simulation_result = sim(x) # use simulator here
objective_vector = np.array([1,2,3,4,5]) # Replace this with your objective target vector
return np.linalg.norm(simulation_result - objective_vector)
res = minimize(func, x0=np.ones(7,1),
bounds=[(1,2),(10,20),(0,1),(0,1),(0,inf),(-inf,0)])
if res.success:
print(res.x)
Невыпуклые задачи
Этот класс задач намного сложнее и требует гораздо более сложных алгоритмов.К счастью scipy.optimize
также предоставляет алгоритмы для этого!Проверьте мой ответ здесь и документация .