scipy.optimize.minimize与powell方法违反最大功能评估

时间:2017-07-04 13:55:53

标签: python scipy

我正在使用带有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.我的代码可能出现什么问题,或者算法本身是否有问题?

1 个答案:

答案 0 :(得分:1)

每次迭代需要评估函数multiple times。出于某种原因(我猜性能或其他实现细节),仅检查该数字once per iteration。这就是为什么可以超过最大评估。

评估计数超过最大值的程度取决于x的维度,还取决于函数和数据。不幸的是,没有简单的方法来估计过冲,但在大多数情况下这不应该是一个问题。