basinhopping
, brute
и differential_evolution
- методы, доступные для глобальной оптимизации. Как вы уже обнаружили, глобальная оптимизация методом перебора не будет особенно эффективной.
Дифференциальная эволюция - это стохастический метод, который должен работать лучше, чем грубая сила, но все же может потребовать большого количества оценок целевых функций. Если вы хотите использовать его, вы должны поиграть с параметрами и посмотреть, что лучше всего подойдет для вашей проблемы. Это работает лучше, чем другие методы, если вы знаете, что ваша целевая функция не является «гладкой»: в функции или ее производных могут быть разрывы.
Прыжок в бассейне, с другой стороны, делает стохастические прыжки, но также использует локальную релаксацию после каждого прыжка. Это полезно, если ваша целевая функция имеет много локальных минимумов, но из-за используемой локальной релаксации функция должна быть гладкой. Если вы не можете легко получить градиент своей функции, вы все равно можете попробовать прыгнуть с помощью одного из локальных минимизаторов, который не требует этой информации.
Преимущество подпрограммы scipy.optimize.basinhopping
в том, что она очень настраиваема. Вы можете использовать take_step
, чтобы определить произвольный случайный переход, accept_test
, чтобы переопределить тест, используемый для принятия решения о том, следует ли продолжить или отменить результаты случайного прыжка и релаксации, и minimizer_kwargs
, чтобы настроить локальное поведение минимизации. Например, вы можете переопределить take_step
, чтобы остаться в пределах своих границ, а затем выбрать, возможно, минимизатор L-BFGS-B, который может численно оценивать градиент вашей функции, а также ограничивать параметры. L-BFGS-B работает лучше, если вы установите градиент, но я использовал его без градиента, и он все еще способен хорошо минимизировать. Обязательно прочитайте обо всех параметрах в локальной и глобальной подпрограммах оптимизации и настройте такие параметры, как допуски, как приемлемые, для повышения производительности.