Дифференциальная эволюция Сципи с целыми числами

Я пытаюсь запустить оптимизацию с scipy.optimize.differential_evolution. Код требует границ для каждой переменной в x. Но я хочу найти решение, где части x должны быть целыми числами, в то время как другие могут свободно варьироваться как числа с плавающей точкой. Соответствующая часть моего кода выглядит

    bounds = [(0,3),(0,3),(0,3),???,???]
    result = differential_evolution(func, bounds)

Чем я заменяю???, чтобы заставить эти переменные быть целыми в данном диапазоне?

3 ответа

Как отмечено в комментариях, нет прямой поддержки "целочисленного ограничения".

Однако вы можете минимизировать модифицированную целевую функцию, например:

def func1(x):
    return func(x) + K * (x[3] - round(x[3]))**2

и это заставит x[3] к целочисленному значению (к сожалению, вы должны настроить K параметр).

Альтернативой является округление (некоторые из) вещественных параметров перед оценкой целевой функции:

def func1(x):
    z = x;
    z[3] = round(z[3])
    return func(z)

Оба являются общими методами решения проблемы дискретной оптимизации с использованием дифференциальной эволюции, и они работают довольно хорошо.

Дифференциальная эволюция может поддерживать целочисленное ограничение, но текущая реализация scipy должна быть изменена.

Из исходного кода Scipy видно, что их DE основаны на Storn, R и Price, K, дифференциальной эволюции - простой и эффективной эвристике для глобальной оптимизации в непрерывных пространствах, Журнал глобальной оптимизации, 1997

Однако в этой области был достигнут прогресс, на который указывает этот обзорный документ. Последние достижения в области дифференциальной эволюции - обновленный обзор

Есть несколько статей, которые вносят изменения в алгоритм, чтобы он мог обрабатывать целые числа. У меня не было времени, чтобы посмотреть на все варианты, но, возможно, эта статья может помочь.

Усовершенствованный алгоритм дифференциальной эволюции для задач смешанного целочисленного программирования

Что мне заменить ???, чтобы заставить эти переменные быть целыми в заданном диапазоне?

wrapdiscэто пакет, который представляет собой тонкую оболочку, которая позволит вам оптимизировать ограниченные целочисленные переменные вместе с числами с плавающей запятой с различными оптимизаторы. В ридми есть пример использования. С ним вам вообще не нужно адаптировать свою целевую функцию. Он внутренне использует округление для поддержки целых чисел, хотя эта деталь скрыта от пользователя.

Другие вопросы по тегам