Как включить параллель в scipy.optimize.differential_evolution? - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь найти глобальный минимум функции, используя diff_evolution из scipy.optimize.Как объясняется в справочном руководстве scipy, я должен установить следующие параметры: update = 'deferred', working = количество ядер

Однако, когда я запускаю код, он зависает и ничего не делает.Как я могу решить эту проблему, или есть ли лучший способ распараллеливания глобального оптимизатора?

В моем коде есть следующее:

scipy.optimize.differential_evolution(objective, bnds, args=(), 
            strategy='best1bin', maxiter=1e6,
            popsize=15, tol=0.01, mutation=(0.5, 1),    
            recombination=0.7, seed=None,
            callback=None, disp=False, polish=True,
            init='latinhypercube', atol=0,
            updating='deferred',workers=2)

1 Ответ

0 голосов
/ 27 марта 2019

Сам сталкивался с такой же проблемой.Поддержка параллелизма в scipy.optimize.differential_evolution была добавлена ​​в версии 1.2.0, а версия, которая у меня была, была слишком старой.При поиске документации верхний результат также ссылался на старую версию.Вместо этого более новую документацию можно найти по адресу https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.differential_evolution.html (надеюсь, что скоро это будет лучший результат Google).

Я использую virtualenvironment и pip для управления пакетами и для обновления до последней версииscipy Мне просто нужно было запустить pip install --upgrade scipy.

Чтобы активировать параллелизм, установите флаг workers на что-то > 1 для определенного количества ядер или workers=-1, чтобы использовать все доступные ядра.


Одно предостережение: не делайте ту же ошибку, что и я, и попробуйте запустить дифференциальную эволюцию непосредственно на верхнем уровне скрипта Python, тогда он не запустится (из-за того, как multiprocessing.Pool функции, я полагаю):

import scipy.optimize

def minimize_me(x, *args):
    ...  # Your code
    return result

# DO NOT DO LIKE THIS
...  # Prepare all the arguments
# This will give errors
result = scipy.optimize.differential_evolution(minimize_me, bounds=function_bounds, args=extraargs,
                                               disp=True, polish=False, updating='deferred', workers=-1)
print(result)

Вместо этого поместите код, как показано ниже:

import scipy.optimize

def minimize_me(x, *args):
    ...  # Your code
    return result

# DO LIKE THIS
if __name__ == "__main__":
    ...  # Prepare all the arguments
    result = scipy.optimize.differential_evolution(minimize_me, bounds=function_bounds, args=extraargs,
                                                   disp=True, polish=False, updating='deferred', workers=-1)
    print(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...