IPOPT: прекратить оптимизацию, когда целевая функция не работает - PullRequest
0 голосов
/ 06 мая 2020

Я решаю набор больших задач оптимизации (~ 500 переменных) с помощью IPOPT. Все идет хорошо, за исключением нескольких проблем, которые не сходятся. «не сходиться» означает, что IPOPT просто продолжает работать до предела времени или итераций. Как ни странно, примерно после 75 итераций целевая функция практически не меняется, а ограничения решаются, хотя она продолжает работать. (См. График.)

Есть ли способ остановить IPOPT раньше, когда цель больше не меняется?

enter image description here

Выдержка из вывод IPOPT:

iter objective inf_pr inf_du lg (mu) || d || lg (rg) alpha_du alpha_pr ls
74 2.9875720e + 02 7.34e-04 5.10e + 02 -3.1 2.64e + 02 - 2.04e-01 5.48e-04h 9 ​​Fl
75 2.9881569e + 02 7.33e -04 5.22e + 02 -3.1 1.39e + 02 - 1.00e + 00 1.04e-03h 9 Fl
76 2.9883970e + 02 7.32e-04 5.25e + 02 -3.1 3.11e + 02 - 1.55e-01 6.12e-04h 9 ​​Fl

Мои настройки IPOPT, в попытке заставить его использовать «приемлемый» возврат (который не увенчался успехом, он все еще работает бесконечно):

solver->SetOption("tol", 1e-4);

solver->SetOption("dual_inf_tol", 1.0);
solver->SetOption("constr_viol_tol", 1e-4);
solver->SetOption("compl_inf_tol", 1e-4);

solver->SetOption("acceptable_tol", 1e-2);
solver->SetOption("acceptable_iter", 5);
solver->SetOption("acceptable_dual_inf_tol", 1e10);
solver->SetOption("acceptable_constr_viol_tol", 1e-2);
solver->SetOption("acceptable_compl_inf_tol", 1e-2);
solver->SetOption("acceptable_obj_change_tol", 1e20);

solver->SetOption("print_info_string", "yes");

solver->SetOption("max_cpu_time", 10.0);
solver->SetOption("max_iter", 300);
...