我正在尝试使用scipy.optimize.minimize
函数并设置简单的a <= x <= b
约束条件。但是,我的目标函数经常在界限之外进行评估。据我理解,这是由于minimize
尝试在边界处确定目标函数梯度引起的。
最小示例:
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)
输出结果显示,最小化器跳到点
[1,1]
,然后试图在[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]
...
当然,在这个例子中没有问题,因为fun
也可以在那里评估。但是可能并不总是这种情况...
在我的实际问题中,最小值不能在边界上,我可以通过将 epsilon 添加到范围中来轻松解决此问题。 但是人们期望有一种简单的解决方法,即使最小值可能在边界上,该方法也适用?
PS:如果我是第一个遇到这个问题的人,那就太奇怪了--如果这个问题以前已经被问过,请原谅,我没有在任何地方找到它。