python - 使用 COBYLA 方法的盆地跳跃似乎忽略了约束
问题描述
我在使用带有 method='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
解决方案
正如在scipy.optimize.basinhopping — SciPy v1.1.0 参考指南中所写,盆地跳跃是一种两步法:
- 首先,随机跳转(
take_step
回调) - 然后使用特定的最小化方法从该点找到局部最小值
- 最后,决定是否接受该步骤(
accept_test
回调)
您指定的约束用于最小化方法,它们不会影响跳转步骤。对于跳跃步骤,要么调整stepsize
(随机跳跃的最大位移),要么定义自己的take_step
.
“我认为约束的重点是它永远不会在约束之外尝试 x” - 数学问题中的约束,包括约束优化问题,不是那样工作的。他们只指定解决方案本身必须满足的条件。他们不限制在获得该解决方案时可以使用哪些点,完全取决于算法来选择这些点。
限制数值方法搜索区域的方法是以某种特定于函数和方法性质的方式调整方法参数,以将方法“引导”到正确的方向。
推荐阅读
- java - OpenCV java alpha 混合
- php - 固定总购物车优惠券
- c# - C# - 在我的数据网格中,当我使用按 'Id' Desc 排序的存储过程时,我的表单不显示 Desc
- windows - 在具有 uber-jar 依赖项 (javafx-graphics) 的 Windows 10 上使用 javafx-maven-plugin 构建运行时映像时出错
- c# - 循环遍历 2 个数组(Unity3d)
- vue.js - 即使页面重新加载,我如何在整个 SPA 中维护数据
- wordpress - WooCommerce - 使用位于另一台服务器上的图像导入 CSV - 导入卡在 0%
- android - 如何让 FirebaseAuth.AuthStateListener 在 Kotlin 中工作?
- c# - 从同一来源生成多个图像的最有效方法是什么?C#/ASP.NET
- extjs - 添加选项以存储组件无法正常工作 extjs 6