На мой вопрос уже частично ответили здесь . Мне просто нужно расширить ответ на другую функцию Scipy. (Scipy 1.4.0, Python 3.7 на Windows 10)
Обращаясь к ответу @ ali_m , я попытался применить ту же идею к differential_evolution()
Scipy функция, которая также имеет аргумент callback
.
Я хотел бы убедиться, что моя функция Scipy differential_evolution()
перестает работать после определенного периода времени. В этом случае я выбрал функцию Розенброка с 40 входными параметрами и порогом 0,3 секунды, чтобы выделить то, что происходит.
import numpy as np
from scipy.optimize import differential_evolution, rosen
import time
import warnings
class TookTooLong(Warning):
pass
class MinimizeStopper(object):
def __init__(self, max_sec=0.3):
self.max_sec = max_sec
self.start = time.time()
def __call__(self, xk=None, convergence=None):
elapsed = time.time() - self.start
if elapsed > self.max_sec:
warnings.warn("Terminating optimization: time limit reached",
TookTooLong)
else:
print("Elapsed: %.3f sec" % elapsed)
n_var = 40
upper_bound_array = np.ones(n_var) * 5
lower_bound_array = np.ones(n_var) * -5
bounds = Bounds(lower_bound_array, upper_bound_array)
# function call
res = differential_evolution(Rosen, bounds, strategy='best1bin',disp=False,
callback=MinimizeStopper(),
maxiter=1000000)
В результате я не получаю ошибок, но кажется, что те же логики c используется в Scipy minimize()
здесь не работает. Чтобы быть более точным c, когда я запускаю программу, даже после выдачи предупреждения, программа молча продолжает вычислять все необходимые итерации, пока проблема оптимизации не сходится.
Кто-нибудь знает, почему в этом случае это не работает как в minimize()
случае? Буду очень признателен за вашу помощь.
Заранее спасибо