Ограничения на параметры с использованием дифференциальной эволюции в python

Я пытаюсь использовать дифференциальную эволюцию для оптимизации доступности на основе стоимости. Однако у меня есть три неизвестных параметра (a, b, c), и я могу определить диапазон с помощью границ. Тем не менее, я хочу определить дополнительное ограничение как a+b+c <= 10000. Я использую для этого python, и я попытался использовать опцию "args" в рамках дифференциальной эволюции, но она не работала. Любая информация будет оценена.

2 ответа

Решение

Определение ограничения с использованием дифференциальной эволюции не является подходящим решением для проблемы, которую я описал выше. Для этой цели мы можем использовать команду Nminimize, у которой есть выделенная опция для определения ограничений.

scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)

Вот взломать. Я использовал последний пример из документации и ограничил сумму (x) > 4.1 (без этого ограничения оптимизированное решение равно (0,0)):

from scipy.optimize import differential_evolution
import numpy as np
def ackley(x):
    arg1 = -0.2 * np.sqrt(0.5 * (x[0] ** 2 + x[1] ** 2))
    arg2 = 0.5 * (np.cos(2. * np.pi * x[0]) + np.cos(2. * np.pi * x[1]))

    if x[0]+x[1] > 4.1: #this is the constraint, where you would say a+b+c <=1000
        return -20. * np.exp(arg1) - np.exp(arg2) + 20. + np.e
    else:
        return 1000 #some high value

bounds = [(-5, 5), (-5, 5)]
result = differential_evolution(ackley, bounds)
result.x, result.fun