У меня есть следующие логические и непрерывные переменные, где только некоторые из «процентов» имеют статус 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, похоже, не повлияли на решение.