моя цель состоит в том, чтобы при использовании алгоритма basinhopping
для нахождения глобального минимума останавливать алгоритм всякий раз, когда выполняется условие после нахождения минимума. просмотрев документы здесь (https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.basinhopping.html), со специальной ссылкой на этот раздел, я пришел к выводу, что мне нужно было правильное callback
:
обратный вызов : callable, callback(x, f, accept), необязательный Функция обратного вызова, которая будет вызываться для всех найденных минимумов. x и f — это координаты и значение функции пробных минимумов, а accept означает, были ли приняты эти минимумы. Это можно использовать, например, для сохранения наименьших найденных минимумов N. Кроме того, обратный вызов можно использовать для указания определяемого пользователем критерия остановки, при необходимости возвращая значение True, чтобы остановить процедуру перехода из бассейна.
поэтому я подумал, что, сделав что-то вроде этого:
def callback_on_optimization_indicator(x, f, accepted, threshold=2):
if f > threshold:
print(x, f, accepted, threshold)
return f
else:
return False
и callback=callback_on_optimization_indicator
должно работать. и эффективно останавливает алгоритм basinhopping
, когда выполняется часть "true". проблема в том, что хотя переменные внутри callback_on_optimization_indicator
являются правильными, когда оптимизация завершается и я изучаю объект оптимизации, я получаю разные значения (и x0, и f). Я понятия не имею, почему.
Значение с данными:
(callback) x0 = [some data]
(callback) f = 2.60688517662
тогда как в объекте оптимизации:
opt_obj.x = [different data]
opt_obj.fun = 1.6630711010135293
я неправильно использую функцию обратного вызова?
Я бы так сказал но мне еще предстоит понять как сделать так чтобы я получал в объекте оптимизации первый x0 который удовлетворяет условию в callback
(после того как минимум найден)