将附加参数传递给目标函数

问题描述

我正在尝试按照此结构解决最小化问题:

res=minimize(objective_fnc,x0,args=param,method='Nelder-Mead)

我需要传递一系列参数,这些参数不是优化变量的参数,而是参数,以更一般的方式更改问题的条件/边界。例如,变量 param 是一个带有下一个参数的元组param = (p1,p2,p3)

每当我调用 objective_fnc 时,我都需要传递初始条件 x0 和带有参数的元组,以便在目标函数中使用这些参数。例如,objective_fnc(x0,param)

问题是我收到此错误objective_fnc() takes 2 positional arguments but 4 were given

我知道如果我传递初始条件和参数(不作为元组的一部分,这样:objective_fnc(x0,p1,p3))它可以工作,但我想以更简单的方式编写它以备不时之需稍后传递其他参数。

这里有 minimal reproducible example 有效,其中所有参数都一一传递。但是,如果我将 p1,p3 更改为 `param',则会出现错误

import numpy as np
from scipy.optimize import minimize

def objective_fnc(x,p3):
    """The Rosenbrock function"""
    return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)


class CallbackFunctor:
    def __init__(self,obj_fun):
        self.num_calls = 0
        if self.num_calls == 0:
            print('Optimization problem started')
        self.obj_fun = obj_fun
    
    def __call__(self,x):
        fun_val = self.obj_fun(x,p3)
        self.num_calls += 1
        if self.num_calls % 5 == 0:
            print('Work in progress...')
            print(p1)
            print(p2)
            print(p3)
            
cb = CallbackFunctor(objective_fnc)

# Parameters
p1=10
p2=20
p3=30
param=(p1,p3)
x0 = np.array([1.3,0.7,0.8,1.9,1.2])
res = minimize(objective_fnc,args=(p1,p3),method='nelder-mead',callback=cb,options={'xatol': 1e-8,'disp': True})

print(res.x)

解决方法

如果您的函数具有签名 objective_func(x,bound_limits),其中 bounds_limits 是一个元组,您需要确保解包 args 产生一个元组。因此,您需要传递一个元组的 Iterable:

bound_limits = (param1,param2,param3,param4,param5,param6,param7,param8)
res = minimize(objective_fnc,x0,args=(bound_limits,),method='Nelder-Mead)

请注意,不需要 args 参数。您可以使用 lambda 函数实现相同的目的:

res = minimize(lambda x: objective_fnc(x,bound_limits),method='Nelder-Mead')
,

尝试使用 unpatch with :

objective_fnc(Xo,*bound_limits)

https://stackabuse.com/unpacking-in-python-beyond-parallel-assignment