【问题标题】:To obtain the iteration data from Scipy "SLSQP" solver从 Scipy“SLSQP”求解器获取迭代数据
【发布时间】:2020-11-19 04:37:43
【问题描述】:

我想从 Scipy 求解器“SLSQP”获取迭代信息。我使用回调函数开发了一个代码,如下所述。


from scipy.optimize import minimize, rosen, rosen_der

def callback(xk, step=[0]):
      print(step[0], xk[0] )
      step[0] += 1

x0 = [1.3, 0.7, 0.8, 1.9, 1.2]
res = minimize(rosen, x0, callback=callback, method='SLSQP',
    options={'ftol': 1e-6, 'disp': True})

我得到的求解器输出为

0 -514.1000091552735
1 -135.7415473476321
2 -17.549744746578245
3 17.564262441411472
4 -1.5602312826344646
5 1.0079282528485665
6 0.9069490399784312
7 0.8943984770283425

但是,我想获取函数的值以及每次迭代的决策变量。我怎样才能得到它?

如何将这些信息抓取到 Python 列表中?

有人可以帮帮我吗?

非常感谢您。

【问题讨论】:

  • 您可以编写一个“自定义”求解器来包装 SLSQP 求解器,并在每次迭代时缓存/打印值,然后将它们传递给实际的求解器。
  • @bnaecker 你能详细解释一下如何做到这一点吗?感谢您的支持。

标签: python list optimization scipy


【解决方案1】:

使用包装函数:

def track(f, out_values=None, out_args=None, out_kwargs=None):
    def wrapped(*args, **kwargs):
        if out_args is not None: out_args.append(args)
        if out_kwargs is not None: out_kwargs.append(kwargs)
        val = f(*args, **kwargs)
        if out_values is not None: out_values.append(val)
        return val
    return wrapped

然后:

>>> vars, vals = [], []
>>> x0 = [1.3, 0.7, 0.8, 1.9, 1.2]
>>> res = minimize(track(rosen, vals, vars), x0, method='SLSQP',
...    options={'ftol': 1e-6, 'disp': True})
>>> vals[:5]
[848.22, 848.2200076800586, 848.2199957472086, 848.2199949097634, 848.2200310748821
>>> vars[1]
(array([1.30000001, 0.7       , 0.8       , 1.9       , 1.2       ]),)

【讨论】:

    猜你喜欢
    • 2018-02-09
    • 2016-02-04
    • 2023-04-10
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2011-07-03
    • 1970-01-01
    相关资源
    最近更新 更多