编辑:看起来这已经在这里回答了
它没有出现在我的搜索中,因为我不知道正确的命名法。我暂时把问题留在这里,以防有人因为限制而到达这里。
我正在尝试优化一个几乎在所有点上都是平坦的函数(“阶梯函数”,但维度更高)。
目标是优化一组权重,它们的总和必须为一个,并且是我需要最小化的函数的参数。
问题在于,由于函数在大多数点上都是平坦的,梯度技术会失败,因为它们会立即收敛于起始的“猜测”。
我的假设是,这可以通过(a)退火或(b)遗传算法来解决。Scipy 把我送到盆地跳跃。但是,我找不到任何方法来使用 scipy.
实际问题:如何在没有梯度的情况下解决最小化问题,并为输入变量使用约束和范围?
以下是一个玩具示例(显然可以使用渐变来解决这个示例):
# import minimize
from scipy.optimize import minimize
# define a toy function to minimize
def my_small_func(g):
x = g[0]
y = g[1]
return x**2 - 2*y + 1
# define the starting guess
start_guess = [.5,.5]
# define the acceptable ranges (for [g1, g2] repectively)
my_ranges = ((0,1),(0,1))
# define the constraint (they must always sum to 1)
def constraint(g):
return g[0] + g[1] - 1
cons = {'type':'eq', 'fun': constraint}
# minimize
minimize(my_small_func, x0=start_guess, method='SLSQP',
bounds=rranges, constraints=cons)