Решение МИНЛП с PYOMO/PYSP
Команда,
В настоящее время я работаю над нелинейной стохастической оптимизацией. Пока набор инструментов был действительно полезен, спасибо! Однако добавление нелинейного ограничения вызвало ошибку. Я использую решатель gurobi. Проблема возникает из следующего ограничения.
def max_pcr_power_rule(model, t):
if t == 0:
return 0 <= battery.P_bat_max-model.P_sc_max[t+1]-model.P_pcr
else:
return model.P_trade_c[t+1] + np.sqrt(-2*np.log(rob_opt.max_vio)) \
*sum(model.U_max_pow[t,i]**2 for i in set_sim.tme_dat_stp)**(0.5) \
<= battery.P_bat_max-model.P_sc_max[t+1]-model.P_pcr
model.max_pcr_power = Constraint(set_sim.tme_dat_stp, rule=max_pcr_power_rule)
Я получаю это сообщение об ошибке:
Инициализация расширенного алгоритма формы для задач стохастического программирования. Обнаружено исключение. Менеджер дерева сценариев пытается завершить работу. Трассировка (последний вызов был последним): файл "C:\Users\theil\Anaconda3\Scripts\runef-script.py", строка 5, в файле sys.exit(pyomo.pysp.ef_writer_script.main()) "C:\Users\theil\Anaconda3\lib\site-packages\pyomo\pysp\ef_writer_script.py", строка 863, в основном traceback=options.traceback) Файл" C: \ Users \ theil \ Anaconda3 \ lib \ site-packages \ " pyomo \ pysp \ util \ misc.py ", строка 344, в файле launch_command rc = command(options, *cmd_args, **cmd_kwds) Файл" C: \ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ pysp \ " ef_writer_script.py ", строка 748, в runef. ef.solve() Файл" C: \ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ pysp \ ef_writer_script.py ", строка 430, в решении **solve_kwds) Файл "C:\Users\theil\Anaconda3\lib\site-packages\pyomo\opt\parallel\manager.py", строка 122, в очереди возвращает self._perform_queue(ах, *args, **kwds) Файл "C:\Users\theil\Anaconda3\lib\site-packages\pyomo\opt\parallel\local.py", строка 59, в _perform_queue results = opt.solve(*args, **kwds) Файл" C: \ Users \ Тейл \ Anaconda3 \ Lib \ сайт-пакеты \ pyomo \ неавтоматического \ ба se \ solvers.py ", строка 599, в файле решите self._presolve(*args, **kwds) Файл"C:\Users\theil\Anaconda3\lib\site-packages\pyomo\solvers\plugins\solvers\GUROBI.py", строка 224, в _presolve ILMLicensedSystemCallSolver._presolve(self, *args, **kwds) Файл"C:\Users\theil\Anaconda3\lib\site-packages\pyomo\opt\solver\shellcmd.py", строка 196, в _presolve OptSolver._presolve(self, *args, **kwds) Файл "C:\Users\theil\Anaconda3\lib\site-packages\pyomo\opt\base\solvers.py", строка 696, в _presolve **kwds) файл "C:\Users\theil\Anaconda3\lib\site-packages\pyomo\opt\base\solvers.py", строка 767, в _convert_problem **kwds) файл "C: \ Users \ theil \" Anaconda3\lib\site-packages\pyomo\opt\base\convert.py", строка 110, в файле проблемы convert_problem, symbol_map = converter.apply(*tmp, **tmpkw), файл" C: \ Users \ theil \ Anaconda3 \ " lib\site-packages\pyomo\solvers\plugins\converter\model.py", строка 96, в apply io_options=io_options) Файл"C:\Users\theil\Anaconda3\lib\site-packages\pyomo\core\base " \ block.py ", строка 1681, в записи i o_options) Файл "C:\Users\theil\Anaconda3\lib\site-packages\pyomo\repn\plugins\cpxlp.py", строка 176, в вызове include_all_variable_bounds=include_all_variable_bounds) Файл "C: \ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ repn \ plugins \ cpxlp.py ", строка 719, в _print_model_LP " с нелинейными терминами ". % (constraint_data.name)) ValueError: Невозможно записать допустимый файл LP. Ограничение 1.max_pcr_power[1] имеет тело с нелинейными членами.
Я думал, что проблема может лежать в рамках вложенной формулировки ограничения, то есть комбинации суммы и экспоненциальных членов. Поэтому я помещаю термин sum() в отдельную переменную. Это не изменило ядро характеристики нелинейного ограничения, так что ошибка осталась прежней. Мое другое подозрение было, что проблема лежит в решателе gurobi. Поэтому я попытался использовать ipopt, который выдал следующее сообщение об ошибке:
Ошибка при оценке ограничения 1: невозможно оценить pow'(0,0.5). ОШИБКА: Солвер (ipopt) возвратил ненулевой код возврата (1) ОШИБКА: см. Журнал солвера выше для диагностической информации. Обнаружено исключение. Менеджер дерева сценариев пытается завершить работу. Трассировка (последний вызов был последним): файл "C:\Users\theil\Anaconda3\Scripts\runef-script.py", строка 5, в файле sys.exit(pyomo.pysp.ef_writer_script.main()) "C:\Users\theil\Anaconda3\lib\site-packages\pyomo\pysp\ef_writer_script.py", строка 863, в основном traceback=options.traceback) Файл" C: \ Users \ theil \ Anaconda3 \ lib \ site-packages \ " pyomo \ pysp \ util \ misc.py ", строка 344, в файле launch_command rc = command(options, *cmd_args, **cmd_kwds) Файл" C: \ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ pysp \ " ef_writer_script.py ", строка 748, в файле runef ef.solve()" C: \ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ pysp \ ef_writer_script.py ", строка 434, в файле execute **solve_kwds) Файл "C:\Users\theil\Anaconda3\lib\site-packages\pyomo\opt\parallel\manager.py", строка 122, в очереди возвращает self._perform_queue(ах, *args, **kwds) Файл "C:\Users\theil\Anaconda3\lib\site-packages\pyomo\opt\parallel\local.py", строка 59, в _perform_queue results = opt.solve(*args, **kwds) Файл" C: \ Users \ Тейл \ Anaconda3 \ Lib \ сайт-пакеты \ pyomo \ неавтоматического \ ба se \ solvers.py ", строка 626, в решении"Solver (%s) не завершился нормально " % self.name) pyutilib.common._exceptions.ApplicationError: Solver (ipopt) не завершился нормально
Теперь мне интересно, лежит ли моя ошибка в формулировке ограничения или в том, как я использую решатель. В противном случае мне придется упростить мою проблему, чтобы сделать ее разрешимой.
Я был бы рад, если бы вы могли указать мне правильное направление. Спасибо!
С наилучшими пожеланиями Филипп
1 ответ
Как отметил Эрвин в комментарии, Gurobi, как правило, не предназначен для нелинейных задач.