我正在尝试使用SciPy中实现的SHGO算法,但是当目标函数需要多个参数时会遇到问题。如果我正确理解错误,那么我没有按预期向目标函数传递附加参数(参数),但是我不知道我的语法哪里出了错。有人能解释一下错误的根本原因以及如何解决吗?
下面是我所面临问题的可重现示例。
我不明白为什么会引发TypeError。它说目标函数
请注意,我还尝试将本地最小化器字典重写为
下面是我所面临问题的可重现示例。
![Image presenting the mathematical formulation of the problem implemented in the Python code](https://istack.dev59.com/4c2QK.webp)
import numpy as np
import scipy.optimize as opt
def fobj(x, y, z):
return (x+y+z).sum()
x0 = np.array([0.5, 0.5, 0.5, 0.5])
y = np.array([1, 3, 5, 7])
z = np.array([10, 20, 30, 40])
bnds = list(zip([0, 1, 2, 3], [2, 3, 4, 5]))
cons = {'type': 'eq', 'fun': lambda x: x.sum() - 14}
min_kwargs = {'method': 'SLSQP', 'options': {'maxiter': 100, 'disp': True}}
ret = opt.shgo(func=fobj, bounds=bnds, args=(y, z), constraints=cons, minimizer_kwargs=min_kwargs, options={'disp': True})
运行时会显示以下回溯信息。
Splitting first generation
Traceback (most recent call last):
File "C:\path\lib\site-packages\scipy\optimize\_shgo_lib\triangulation.py", line 630, in __getitem__
return self.cache[x]
KeyError: (0, 0, 0, 0)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\path\lib\site-packages\scipy\optimize\_shgo.py", line 420, in shgo
shc.construct_complex()
File "C:\path\lib\site-packages\scipy\optimize\_shgo.py", line 733, in construct_complex
self.iterate()
File "C:\path\lib\site-packages\scipy\optimize\_shgo.py", line 876, in iterate
self.iterate_complex()
File "C:\path\lib\site-packages\scipy\optimize\_shgo.py", line 895, in iterate_hypercube
self.HC = Complex(self.dim, self.func, self.args,
File "C:\path\lib\site-packages\scipy\optimize\_shgo_lib\triangulation.py", line 25, in __init__
self.n_cube(dim, symmetry=symmetry)
File "C:\path\lib\site-packages\scipy\optimize\_shgo_lib\triangulation.py", line 76, in n_cube
self.C0.add_vertex(self.V[origintuple])
File "C:\path\lib\site-packages\scipy\optimize\_shgo_lib\triangulation.py", line 634, in __getitem__
xval = Vertex(x, bounds=self.bounds,
File "C:\path\lib\site-packages\scipy\optimize\_shgo_lib\triangulation.py", line 557, in __init__
self.f = func(x_a, *func_args)
File "C:\path\lib\site-packages\scipy\optimize\_optimize.py", line 466, in function_wrapper
fx = function(np.copy(x), *(wrapper_args + args))
TypeError: fobj() takes 3 positional arguments but 5 were given
我不明白为什么会引发TypeError。它说目标函数
fobj
中传递了5个参数而不是3个,但我只传递了(y, z)
,所以我不知道它们怎么会变成5个!请注意,我还尝试将本地最小化器字典重写为
min_kwargs = {'method': 'SLSQP', 'args': (x0), 'options': {'maxiter': 100, 'disp': True}}
,但我仍然遇到相同的错误。我确定我没有正确传递参数,但我不知道该如何正确操作。非常感谢您的任何帮助。
sum
后面的括号是在创建问题时误输的,那么您应该编辑问题并修正代码,以便可以使用问题中的代码重现 实际 问题。 - Warren Weckesserfobj
的return
行中,在.sum
后添加了缺失的括号)。我认为这并不重要,因为另一个用户已经在下面的答案中捕捉并提到了它。对于造成的困惑,我感到抱歉。无论如何,根据此GitHub问题的报告,似乎这是SHGO当前实现(截至SciPy v1.8.1)的一个实际错误。有什么快速修复的想法吗? - AB8