Je cherche à utiliser scipy.optimize.minimize
avec des bornes simples a <= x <= b
. Cependant, il arrive souvent que ma fonction cible soit évaluée juste à l'extérieur des bornes. À ma connaissance, cela se produit lorsque minimize
tente de déterminer le gradient de la fonction cible à la frontière.
Exemple minimal:
import math
import numpy as np
from scipy.optimize import Bounds, minimize
constraint = Bounds([-1, -1], [1, 1], True)
def fun(x):
print(x)
return -math.exp(-np.dot(x,x))
result = minimize(fun, [-1, -1], bounds=constraint)
La sortie montre que le minimiseur saute au point [1,1]
puis tente d'évaluer à [1,00000001, 1]
:
[-1. -1.]
[-0.99999999 -1. ]
[-1. -0.99999999]
[-0.72932943 -0.72932943]
[-0.72932942 -0.72932943]
[-0.72932943 -0.72932942]
[-0.22590689 -0.22590689]
[-0.22590688 -0.22590689]
[-0.22590689 -0.22590688]
[1. 1.]
[1.00000001 1. ]
[1. 1.00000001]
[-0.03437328 -0.03437328]
...
Évidemment, il n'y a aucun problème dans cet exemple, car fun
peut être évalué aussi là. Mais ce n'est pas toujours le cas...
Dans mon problème réel, le minimum ne peut pas être sur la frontière et j'ai la solution de contournement facile d'ajouter un epsilon aux bornes. Mais on pourrait s'attendre à ce qu'il y ait une solution simple à ce problème qui fonctionne également si le minimum peut être à une frontière?
PS : Il serait étrange que je sois le premier à rencontrer ce problème -- désolé si cette question a été posée auparavant quelque part, mais je ne l'ai pas trouvée.