Используйте функцию обратного вызова в scipy.optimize.to, чтобы остановить процесс через определенное время - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь использовать аргумент callback в методе scipy.optimize.differential_evolution , чтобы остановить процесс минимизации после некоторого указанного параметра max_time.

Приведенный ниже код, по-видимому, достигает функции callbackF() один раз, а затем никогда.

Что я здесь не так делаю?


from scipy.optimize import differential_evolution as DE
import time as t

# Max time in seconds
max_time = 3.

def callbackF(start_t):
    time_elapsed = t.time() - start_t
    if time_elapsed > max_time:
        print("Stop")
        return True

def DEdist(model):
    res = (1. - model[0])**2 + 100.0 * (model[1] - model[0]**2)**2 + \
        (1. - model[1])**2 + 100.0 * (model[2] - model[1]**2)**2
    return res

start_t = t.time()
bounds = [[0., 10.], [0., 10.], [0., 10.], [0., 10.]]
result = DE(
    DEdist, bounds, popsize=100, maxiter=1500, callback=callbackF(start_t))
print(t.time() - start_t)

1 Ответ

2 голосов
/ 16 мая 2019

Вы передаете возвращаемое значение от вызова callbackF(start_t).То, что вы хотите, это передать саму функцию.Вот один из способов сделать это

from scipy.optimize import differential_evolution as DE
import time as t

# Max time in seconds
max_time = 3.

def get_callback(start_t):
    def callbackF(current_params, convergence):
        time_elapsed = t.time() - start_t
        if time_elapsed > max_time:
            print("Stop")
            return True
    return callbackF

def DEdist(model):
    res = (1. - model[0])**2 + 100.0 * (model[1] - model[0]**2)**2 + \
        (1. - model[1])**2 + 100.0 * (model[2] - model[1]**2)**2
    return res

start_t = t.time()
bounds = [[0., 10.], [0., 10.], [0., 10.], [0., 10.]]
result = DE(
    DEdist, bounds, popsize=100, maxiter=1500, callback=get_callback(start_t))
print(t.time() - start_t)

Я добавил *args, **kwargs, потому что некоторые вызовы kwarg convergence были пропущены, и я не хотел искать в документации, есть ли что-нибудь еще, чтопередается в функцию обратного вызова.

EDIT - делает подпись функции более значимой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...