【问题标题】:scipy basinhopping with callback: stop the algorithm when a condition is met带有回调的scipy盆地跳跃:满足条件时停止算法
【发布时间】:2018-06-19 20:51:52
【问题描述】:

我的目标是,在使用basinhopping 算法来找到全局最小值时,在找到最小值后只要满足条件就停止算法。通过查看此处的文档 (https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.basinhopping.html),特别参考本节,我推断出我需要的是正确的 callback

回调: 可调用,回调(x,f,接受),可选 一个回调函数,将为找到的所有最小值调用。 x 和 f 是试验最小值的坐标和函数值,accept 是该最小值是否被接受。例如,这可用于保存找到的最低 N 最小值。此外,回调可用于指定用户定义的停止标准,方法是可选地返回 True 以停止盆地跳跃例程。

因此我认为,通过这样做:

def callback_on_optimization_indicator(x, f, accepted, threshold=2):

    if f > threshold:
        print(x, f, accepted, threshold)
        return f
    else:
        return False

callback=callback_on_optimization_indicator 应该可以工作。当满足 "true" 部分时,它确实会停止 basinhopping 算法。问题是,尽管callback_on_optimization_indicator 中的变量是正确的,但当优化完成并检查优化对象时,我得到不同的值(x0 和 f)。我不知道为什么。

数据意义:

(callback) x0  = [some data]
(callback) f = 2.60688517662

而在优化对象中:

opt_obj.x = [different data]
opt_obj.fun = 1.6630711010135293

我是否错误地使用了回调函数?

我会这么说,但我还没有理解如何做到这一点,以便我在优化对象中获得满足callback 中条件的第一个 x0(在找到最小值之后)

【问题讨论】:

  • 你得到的变量是回调执行时传入的变量......现在为了解决这个问题,有时你可以使用闭包之类的东西
  • 关闭?对不起,我不熟悉这个词
  • 这是我非常简单的解释版本:当您在另一个函数的范围内定义一个函数时,外部函数中的变量声明对内部函数可用(“封闭”).. google有很多信息,其中大部分令人困惑
  • @Asher11:使用the example code in the docs,我无法重现该问题。你能提供一个可运行的例子吗?
  • 对不起,我不知道为什么,但是通过使用 def callback_on_optimization_indicator(x, f, accepted, threshold=2): if f > threshold: print(x, f, accepted, threshold) return True else : return False 我解决了。我不知道为什么,因为这是我尝试的第一件事(当时我不安全),现在它可以工作了。

标签: python optimization callback scipy minimization


【解决方案1】:

回调显示停止前的 x0 值。

opt_obj 记录到该点的最小值(低于阈值 2)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2022-06-17
    • 2016-04-12
    相关资源
    最近更新 更多