scipy.optimize.basinhopping, кажется, вызывает функцию, которую хочет минимизировать несколько (четыре) раза с одинаковыми входными параметрами и получать одинаковый вывод. Хотя он работает так, что приходит к правильному ответу, я не понимаю, почему он вызывает функцию 4 раза, и для реальной проблемы я пытаюсь оптимизировать это, что существенно замедляет конвергенцию.
Я пытался использовать разные minimizer_kwargs = minimizer_kwargs, но это не имеет значения. Я не хочу закорачивать алгоритм, но выполняю какой-то тип (псевдокод):
если current_iter> 1, пропустить функцию оценки, возвращая предыдущие результаты
Ниже приводится простой пример, приведенный на сайте Сципиона. Я только добавил "print ('x is:', x, 'f is:', f)"
import numpy as np
from scipy.optimize import basinhopping
def func2d(x):
f = np.cos(14.5 * x[0] - 0.3) + (x[1] + 0.2) * x[1] + (x[0] +0.2) * x[0]
print('x is:', x, 'f is:', f)
return f
x0 = [-1.0, 1.0]
ret = basinhopping(func2d, x0,niter=2)
print("global minimum: x = [%.4f, %.4f], f(x0) = %.4f" % \
(ret.x[0],ret.x[1],ret.fun))
Вывод будет таким:
x is: [-1. 1.] f is: 1.3846475170452792
x is: [-0.99999999 1. ] f is: 1.3846476605383349
x is: [-1. 1.00000001] f is: 1.3846475498278341
x is: [-1. 1.] f is: 1.3846475170452792
x is: [-1.98463072 0.77505036] f is: 3.6028590636594706
x is: [-1.98463072 0.77505036] f is: 3.6028590636594706
x is: [-1.98463071 0.77505036] f is: 3.6028588520736204
x is: [-1.98463072 0.77505038] f is: 3.602859089738004
x is: [-1.39207434 0.91042634] f is: 2.605736986404326
x is: [-1.39207434 0.91042634] f is: 2.605736986404326
x is: [-1.39207433 0.91042634] f is: 2.60573716351191
x is: [-1.39207434 0.91042635] f is: 2.6057370165173777
Почему он вызывает один и тот же вход 4 раза?