Как получить значение переменной решения после максимального лимита итераций в Gekko - PullRequest
2 голосов
/ 12 апреля 2020

Я написал свой код в python3 и решил его с помощью решателя Gekko.

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

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Вы можете получить доступ к решению, установив debug=0 при вызове solve:

m.solve(debug=0)

По умолчанию debug=1 выдает исключение при возникновении ошибки, например, при достижении максимального числа итераций. Вот пример, который обычно решается за 5 итераций. При m.options.max_iter=4 он достигает максимальных итераций до достижения успешного решения.

from gekko import GEKKO
m = GEKKO(remote=False) # create GEKKO model
x = m.Var(value=0)      # define new variable, initial value=0
y = m.Var(value=1)      # define new variable, initial value=1
m.Equations([x + 2*y==0, x**2+y**2==1]) # equations

m.options.MAX_ITER=4
m.solve(debug=0)        # solve

print([x.value[0],y.value[0]]) # print solution

При debug=0 возвращается неверный ответ на итерации 4, когда решатель почти завершил решение.

[-0.89473125735, 0.44736562868]

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

0 голосов
/ 16 апреля 2020

Вопрос: 1) Я решаю проблему MINLP с помощью APOPT Solver. И мои переменные решения определяются как целочисленные. Я получил результат 10000-й итерации, как вы предложили. но значения переменных решения не являются целыми числами. Так почему же APOPT Solver вычисляет нецелое решение?

Ответ: Существует опция, которая классифицируется как целое число. Допуск по умолчанию - любое число в пределах 0,05 от целочисленного значения. Вы можете изменить это следующим образом: m.solver_options = ['minlp_integer_tol 1']

2) Я запускаю код для "m.options.MAX_ITER = 100" и использую m = GEKKO (), т.е. используя удаленный сервер , Но мой код все еще работает для 10000-й итерации.

Ответ: Можно сделать это альтернативно: m.solver_options = ['minlp_maximum_iterations 100']

Большое спасибо Проф. Джон Хеденгрен для быстрых ответов.

Гекко

...