APOPT находит лучший локальный минимум для проблемы MINLP, когда я использую меньше итераций nlp. Я ожидал обратного результата, чего мне не хватает? - PullRequest
3 голосов
/ 27 мая 2020

У меня есть следующие логические и непрерывные переменные, где только некоторые из «процентов» имеют статус 1.

status[i] = m.Array(m.Var, p, lb=0, ub=1, integer=True)
percent[i] = m.Array(m.FV, p, value=1, lb=0.6, ub=1.1)

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

Моя цель - линейное суммирование статуса, процента и константы.

Я использую следующие варианты решателя:

m = GEKKO(remote=False)
    # Options
    m.options.SOLVER = 1
    m.options.LINEAR = 0

    # optional solver settings with APOPT
    m.solver_options = ['minlp_maximum_iterations 10000',
                    'minlp_max_iter_with_int_sol 500',
                    'minlp_gap_tol 0.01',
                    'nlp_maximum_iterations 500',
                    'minlp_as_nlp 0',
                    'minlp_interger_leaves = 0',
                    'minlp_branch_method 1',
                    'minlp_integer_tol 0.01',
                    'minlp_print_level 2'
                    ]

Моя возвращенная цель это: 2140,05 , ни одно из ограничений не нарушено, и решение очень хорошее. Однако, уменьшив nlp_maximum_iterations до 10, я могу получить еще лучшее решение 2138.67 .

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

В моем тестировании проблемы кажется, что nlp_max_iterations является определяющим фактором для погоды или нет, он находит меньшую из двух затрат. minlp_maximum_iterations, minlp_max_iter_with_int_sol и minlp_gap_tol, похоже, не повлияли на решение.

1 Ответ

2 голосов
/ 28 мая 2020

Вот несколько советов, которые могут помочь:

  • Используйте min3 вместо min2. При этом используется форма двоичной переменной вместо формы MP CC, которая может давать ложные решения.
  • APOPT должен сохранять лучшее целочисленное решение и возвращать его при достижении максимального числа итераций. Является ли решение с целью 2138.67 целочисленным?
  • Если это проблема максимизации, то 2140.05 будет лучшим решением. Не могли бы вы подтвердить, что вы используете m.Minimize() вместо m.Maximize()?

Решатель APOPT использует метод ветвления и привязки , который решает проблемы нелинейного программирования (NLP), последовательно ограничивающие переменные при целочисленных ограничениях. Вот методы объявления двоичных, целочисленных и специальных упорядоченных наборов .

...