You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用SciPy的dual_annealing优化器时遇参数错误求助

调用SciPy的dual_annealing优化器时遇参数错误求助

嗨,我来帮你搞定这两个报错问题,咱们逐个分析:

第一个错误:TypeError: dual_annealing() got an unexpected keyword argument 'options'

SciPy里的dual_annealing和minimize这类优化器不一样,它不支持options字典参数,所有的配置参数(比如maxiter)都是直接作为关键字参数传递的,不需要打包进options里。所以你第一个写法里的options={"maxiter": budget}是错的,直接改成maxiter=budget就行。

第二个错误:TypeError: objective_function() takes from 2 to 3 positional arguments but 7 were given

这个问题出在目标函数定义和你传入的args不匹配上:

  • 你的目标函数func定义是def func(params, y, penalty_list=None):,除了优化变量params外,只接受1个必填参数y和1个可选参数penalty_list,总共最多3个参数。
  • 但你传入的args是[df_1, df_2, df_3, df_4, df_5, name],一共6个参数,加上params的话,调用func时就会传入7个参数,自然就报错了。

解决办法:

要么调整目标函数的参数列表,让它能接收你传入的这6个额外参数;要么把这6个参数打包成一个对象(比如字典、元组),减少args的元素数量。举个例子,调整函数定义的写法:

import scipy.optimize as spo

# 尽量别用eval,直接引用函数更安全简洁
optimizer = spo.dual_annealing

# 调整函数参数,和args里的6个元素对应
def func(params, df_1, df_2, df_3, df_4, df_5, name):
    # 这里写你的计算逻辑,params是优化的参数数组
    <more code here>

args = [df_1, df_2, df_3, df_4, df_5, name]

# 正确的调用方式,直接传maxiter,不用options
result = optimizer(func, 
                   bounds=[(0, 1)] * len(df_values),
                   args=args,
                   maxiter=budget)

另外提一句,尽量避免用eval(optimizer_fn)这种写法,不仅有安全风险,如果字符串写错了还容易出奇怪的错误,直接写optimizer = spo.dual_annealing就好。

备注:内容来源于stack exchange,提问作者madmatrix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 12:48:05