Как объявить нелинейную целевую функцию в Pyomo?и эффективный способ объявления ограничений? - PullRequest
0 голосов
/ 23 ноября 2018

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

ОШИБКА: Солвер (asl) возвратил ненулевой код возврата(3221225477) ОШИБКА: Журнал решателя: Bonmin 1.8.6 с использованием Cbc 2.9.9 и Ipopt 3.12.8 bonmin: Трассировка (последний последний вызов):

Файл "", строка 2, в результатах = опция.решить (модель)

Файл "C: \ Anaconda \ lib \ site-packages \ pyomo \ opt \ base \ solvers.py", строка 626, в решении "Solver (% s) не завершился нормально"% self.name)

ApplicationError: Solver (asl) не завершился нормально

#

Определение функции моей цели:

`def obj_func(model):
   global summer
   summer = 0
   global volumer
   volumer = 0
   for i in range(0,len(data)):
        summer += model.x[i]*data.loc[i,'Predicted.Profit']
   for j in range(0,len(data)):
        volumer += model.x[j]*data.loc[j,'Predicted.Liters.Sold']
   return summer/volumer`

Я вызываю решатель через SolverFactoryНаконец, я также хотел бы знать наиболее эффективный способ создания ограничений, поскольку у меня есть ограничения в диапазоне 100+, и некоторые из них являются нелинейными.Когда я пытаюсь решить проблему с помощью этой модели, использование памяти увеличивается до 100%, и компьютер зависает.

1 Ответ

0 голосов
/ 27 ноября 2018

Вы должны проверить вывод решателя, чтобы понять, почему он не работает.Вы можете распечатать эти выходные данные на экране, добавив параметр tee=True при вызове решателя:

SolverFactory('bonmin').solve(model, tee=True)

Кроме того, при объявлении ограничений и целей Pyomo следует избегать использования +=.Это часто может привести к значительному снижению производительности при построении выражений Pyomo.Вот рекомендуемый способ написания вашей целевой функции:

def obj_func(model):
   return sum(model.x[i]*data.loc[i,'Predicted.Profit'] for i in model.I)/sum(model.x[j]*data.loc[j,'Predicted.Liters.Sold'] for j in model.J)
model.Objective(rule=_obj_func)

, где model.I и model.J являются либо компонентами Pyomo Set, либо списками Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...