ScipyOptimizer дает неверный результат оптимизации

Я выполняю задачу нелинейной оптимизации в OpenMDAO, оптимальное решение которой мне известно (я просто хочу проверить решение). Я использую SLSQP конфигурацию драйвера ScipyOptimizer от openmdao.api.

У меня есть 3 проектных переменных A, B и C, их соответствующие проектные пространства (от Amin до Amax для A и т. д.) и одна целевая функция Z. Как Я сказал, что знаю оптимальные значения для всех трех переменных проекта (назовем их Asol, Bsol и Csol), которые дают минимальное значение Z (назовем его Zsol).

Когда я запускаю эту задачу, я получаю значение Z больше, чем Zsol, что означает, что это не оптимальное решение. Когда я назначаю Csol переменной C и запускаю задачу только с A и B в качестве переменных проекта, я получаю значение Z, которое намного ближе к Zsol и которое на самом деле меньше, чем то, что я получил ранее (в сценарии с 3 переменными проекта).

Почему я наблюдаю такое поведение? Разве ScipyOptimizer не должен дать одно и то же решение в обоих случаях?

РЕДАКТИРОВАТЬ: добавление кода..

from openmdao.api import IndepVarComp, Group, Problem
from openmdao.api import ScipyOptimizer

class RootGroup(Group):
    def __init__(self):
        super(RootGroup, self).__init__()

        self.add('desvar_f', IndepVarComp('f', 0.08))
        self.add('desvar_twc', IndepVarComp('tool_wear_compensation', 0.06))
        self.add('desvar_V', IndepVarComp('V', 32.0))
        # Some more config (adding components, connections etc.)

class TurningProblem_singlepart(Problem):
    def __init__(self):
        super(TurningProblem_singlepart, self).__init__()

        self.root = RootGroup()

        self.driver = ScipyOptimizer()
        self.driver.options['optimizer'] = 'SLSQP'

        self.driver.add_desvar('desvar_f.f', lower=0.08, upper=0.28)
        self.driver.add_desvar('desvar_twc.tool_wear_compensation', lower=0.0, upper=0.5)
        self.driver.add_desvar('desvar_V.V', lower=32.0, upper=70.0)
        self.driver.add_objective('Inverse_inst.comp_output')
        # Other config

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


person Amogh Kulkarni    schedule 19.04.2016    source источник
comment
Можете ли вы показать нам какой-нибудь код?   -  person Ryan O'Donnell    schedule 20.04.2016
comment
Да, я собираю фрагменты кода, чтобы было понятнее. Фактический код намного больше, поэтому я не стал помещать его в пост. Я отредактирую сообщение в ближайшее время.   -  person Amogh Kulkarni    schedule 20.04.2016
comment
Потрясающий! Это всегда далеко :)   -  person Ryan O'Donnell    schedule 20.04.2016
comment
Спасибо. :) Пожалуйста, дайте мне знать, если вам нужно больше объяснений кода.   -  person Amogh Kulkarni    schedule 20.04.2016
comment
Вы ожидаете, что этот оптимизатор выполнит глобальную оптимизацию? ScipyOptimizer — это оболочка вокруг scipy.optimize.minimize, которая выполняет локальную оптимизацию.   -  person user2357112 supports Monica    schedule 20.04.2016
comment
Это было мое первое предположение - что я получаю локальные минимумы. Но я попытался инициализировать desvar_twc значением, которое выше, чем в решении, но это дало мне тот же (неправильный) результат. Как видно из кода, я инициализировал desvar_twc значением 0,06, а оптимальное решение — 0,05. Но выполнение этой задачи дает мне значение 0,00; хотя значение целевой функции выше при 0,00, чем при 0,05.   -  person Amogh Kulkarni    schedule 20.04.2016
comment
Он мог сделать слишком большой шаг и перешагнуть необходимый вам минимум, или, поскольку это проблема многомерной оптимизации, он мог обойти глобальный минимум.   -  person user2357112 supports Monica    schedule 20.04.2016


Ответы (1)


Не видя вашей реальной модели, мы не можем ничего сказать наверняка. Однако НЕ решение локального оптимизатора не зависит от начальных условий в целом. Это только в том случае, если задача выпуклая. Итак, я бы предположил, что ваша проблема не выпуклая, и вы сталкиваетесь с локальными оптимумами.

Вы можете попытаться обойти это, используя оптимизатор COBYLA вместо SLSQP, который, по моему опыту, может лучше перепрыгивать некоторые локальные оптимумы. Но если ваша проблема действительно сложная, я бы посоветовал вам переключиться на NSGA-II или ALPSO из библиотеки pyopt-sparse< /а>. Это оптимизаторы, основанные на эвристике, которые хорошо справляются с поиском «самого большого холма», хотя они не всегда поднимаются до его вершины (они не сходятся так плотно). Эвристические алгоритмы также обычно дороже, чем методы, основанные на градиенте.

person Justin Gray    schedule 19.04.2016
comment
Спасибо за указатели. Я пытаюсь решить проблему с COBYLA прямо сейчас и обновлю пост с результатами. Единственное, что меня смущало, это то, что desvar_twc=0.05 было оптимальным решением, оптимизатор дал мне 0,00 в качестве оптимального значения, даже когда я инициализировал его с 0,06. Что мне здесь не хватает? - person Amogh Kulkarni; 20.04.2016