我正在使用带有Powell算法的scipy.optimize.minimize优化函数。有一个名为maxfev的选项可以设置最大功能评估。但它似乎总是不起作用。算法跨越功能评估限制。代码如下:
def func_eval(x):
import math as math
funcval=0
dimension=len(x)
tmp=0
tmp2=0
for i in range(dimension):
tmp +=x[i]
for i in range(dimension):
tmp2=(tmp-x[i])*x[i]
funcval += dimension*(math.pow(x[i],2)+0.4*tmp2)
return funcval
from scipy.optimize import minimize
x=[-11.04021,-92.72567,28.60728,68.65449,66.41443,-25.59824,73.97660,-69.85293,1.10955,17.56914]
res=minimize(func_eval,x,method='Powell',options={'maxfev':220})
print(res.fun)
print(res.nfev)
第二个选项的输出,即func评估的数量是298而不是220.我的代码可能出现什么问题,或者算法本身是否有问题?
答案 0 :(得分:1)
每次迭代需要评估函数multiple times。出于某种原因(我猜性能或其他实现细节),仅检查该数字once per iteration。这就是为什么可以超过最大评估。
评估计数超过最大值的程度取决于x
的维度,还取决于函数和数据。不幸的是,没有简单的方法来估计过冲,但在大多数情况下这不应该是一个问题。