使用COBYLA方法进行盆景处理似乎忽略了约束条件

问题描述 投票:1回答:1

我使用方法='COBYLA'使用盆式购物来指定约束时遇到问题。这是一个出问题的测试用例。基本上,约束被忽略,并且在指定范围之外存在功能试验。我指定一个简单的二次方,最小值为[0,0],搜索-3<x[0],但是从输出中可以看出,在该范围之外有很多搜索(我增加了步长以使其显而易见)

import numpy as np
from scipy.optimize import basinhopping

def f(x):
    if x[0]<-3 : 
        print('outside range ',x[0])
    return x[0]**2+x[1]**2

cons = [{'type':'ineq','fun': lambda x: x[0]+3}]
kwargs = {'method':'COBYLA','constraints':cons}

ret=basinhopping(f, [5,1],T=1,stepsize=1000,niter=1,minimizer_kwargs=kwargs)
print(ret)

runfile('py/cobyla_test', wdir='/py', post_mortem=True)
outside range  -446.14581341127945
outside range  -445.14581341127945
outside range  -445.14581341127945
outside range  -444.14581341127945
[etc... lots of output deleted]
[-4.81217825e-05 -5.23242054e-05] 5.0535284302996725e-09
python scipy minimization
1个回答
1
投票

正如scipy.optimize.basinhopping — SciPy v1.1.0 Reference Guide所写,盆地跳跃是一个两步法:

  • 首先,随机跳转(take_step回调)
  • 然后使用指定的最小化方法从该点找到局部最小值
  • 最后,决定步骤是否被接受(accept_test回调)

您指定的约束是针对最小化方法的,它们不会影响跳转步骤。对于跳跃步骤,要么调整stepsize(随机跳转的最大位移),要么定义自己的take_step


“我认为约束的关键在于它永远不会在约束之外尝试x” - 数学问题中的约束,包括constrained optimization problem,不会那样工作。它们仅指定解决方案本身必须满足的条件。它们不限制在获得该解决方案时可以使用哪些点,完全由算法来选择这些。

限制数值方法搜索的区域的方法是以某种方式调整方法参数,特定于函数和方法的性质,以“引导”方法到正确的方向。

© www.soinside.com 2019 - 2024. All rights reserved.