Pyomo-IPOPT: решатель попадает в локальные минимумы, как этого избежать? - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь решить задачу оптимизации, состоящую в том, чтобы найти глобальный максимум высокомерной (10+) монотонной функции (как в монотонной во всех направлениях).Ограничения таковы, что они сокращают пространство поиска плоскостями.

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

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

edit:

Два намека на решение:

  • мои переменные определялись с очень бесконечными границами, например, bounds=(0,None) для перемещения по бесконечной полуоси,Я наложил на них две конечные границы.

  • Я сейчас использую несколько стартов с:

    opt = SolverFactory('multistart')
    results = opt.solve(self.model, solver='ipopt', strategy='midpoint_guess_and_bound')
    

Пока это сделало мойдоволен конвергенцией.

1 Ответ

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

Извините, IPOPT - это местный решатель.Если вы действительно хотите найти глобальные решения, вы можете использовать глобальный решатель, такой как Baron, Couenne или Antigone.Существует компромисс: глобальные решатели работают медленнее и могут не работать для больших проблем.

В качестве альтернативы, вы можете помочь локальным решателям с хорошей начальной точкой.Имейте в виду, что методы активного набора часто лучше в этом отношении, чем методы внутренней точки.Иногда многостартовые алгоритмы используются для предотвращения плохих локальных оптимумов: используйте кучу разных отправных точек.Pyomo имеет некоторые возможности для этого (см. Документацию).

...