Ищем алгоритм, который также возвращает локальные минимумы.

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

Я ищу алгоритм Python, который возвращает мне глобальные а также все локальные минимумы.

Есть ли алгоритм, решающий эту задачу?

Или существует ли какой-либо из алгоритмов глобального минимума, который также возвращает локальные минимумы?


person user7468395    schedule 06.08.2019    source источник
comment
Те подходы, которые вы упомянули, попытаются вернуть некоторые глобальные минимумы, но я сомневаюсь, что многие библиотеки дадут вам какие-то гарантии (заметное исключение: Couenne). У этого есть причина: основная проблема обычно NP-трудна. Эта жесткость сводится к тому, что локальных минимумов может быть экспоненциально много. Все еще надеетесь на перечисление всех минимумов? Даже если предположить, что время бесконечно, все станет еще хуже, поскольку возможность перечисления требует некоторой надежной и полной системы доказательств, чтобы рассуждать о состоянии перечисления минимумов. Иметь тот, который не растет экспоненциально в памяти, обычно хуже со временем.   -  person sascha    schedule 06.08.2019
comment
Предположим, вы получили список всех 20 000 000 локальных минимумов. Что бы вы хотели с этим сделать?   -  person maxy    schedule 06.08.2019
comment
@maxy: я ищу любое решение моей проблемы, описанной здесь: stackoverflow.com/q/57375144/10698244   -  person user7468395    schedule 06.08.2019
comment
Не все так просто, особенно для функции черного ящика без градиентов. Можно использовать сетку и оптимизировать для каждого региона.   -  person Erwin Kalvelagen    schedule 07.08.2019


Ответы (1)


Или есть какие-либо алгоритмы глобального минимума, которые возвращают также локальные минимумы?

Я не понимаю, что вы подразумеваете под глобальными минимальными алгоритмами, но поскольку вы упомянули симулированный отжиг, я предполагаю, что вы говорите о метаэвристике с возможностями глобального поиска.

Нет никакой гарантии, что метаэвристика, очень часто используемая для решения NP-сложных задач, будет исследовать все пространство поиска, следовательно, нет гарантии, что будут найдены все локальные минимумы. Тем не менее, я предполагаю, что вы это знаете, и что вы хотите, так это изменить метод таким образом, чтобы он предоставлял, а не только одно решение (наилучшее из найденных), список локальных минимумов, найденных во время процедуры поиска глобальных минимумов.

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

Приведенный ниже псевдокод представляет собой модифицированный алгоритм ILS, чтобы сохранить все локально оптимальные решения, найденные в ходе процедуры поиска.

HillClimbing(S)
   while S is not locally optimal do
       S ← best(N(S)) // best solution in neighborhood N of solution S
   Return S

IteratedLocalSearch()
    L ← {} // set of locally optimal solutions
    G ← randomSolution()
    S ← G
    while criterionIsNotMeet() do
        HillClimbing(S)
        Add S to L // add the current local
        if S.objective < G.objective do // minimization
            G ← S // best solution found
        perturbateSolution(Copy(S))

Такие алгоритмы могут быть легко реализованы. Если вы решите реализовать себя, получите хороший справочный документ, если этого недостаточно, вы можете попытаться найти хорошую реализацию на GitHub или Mathworks Discovery, чтобы основывать свое кодирование.

person WillEnsaba    schedule 07.08.2019