как объявить нелинейную целевую функцию в pyomo? и эффективный способ объявления ограничений?

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

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

Файл "", строка 2, в results = opt.solve (модель)

Файл "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%, и мой компьютер зависает.


person linearprogrammer    schedule 23.11.2018    source источник
comment
Ищите журналы. Они написаны в какое-то место. Но это звучит так же, как ошибка памяти, и тогда трудно рекомендовать что-то другое, кроме решения меньшей модели или покупки барана. Это похоже на задачу машинного обучения, в которой общие решатели nlp часто не масштабируются.   -  person sascha    schedule 23.11.2018
comment
Что вы имеете в виду под «Похоже на задачу машинного обучения, в которой общие решатели nlp часто не масштабируются?»   -  person linearprogrammer    schedule 23.11.2018
comment
Вы занимаетесь машинным обучением с большими данными? Тогда не ожидайте, что сможете использовать общую нелинейную опцию   -  person sascha    schedule 23.11.2018
comment
Нет, у меня есть набор данных размером (178848,40). Я могу запустить CBC очень легко, но он не работает с BONMIN или COUENNE   -  person linearprogrammer    schedule 23.11.2018
comment
Это довольно много, и вы не должны сравнивать linear opt с нелинейным opt.   -  person sascha    schedule 23.11.2018
comment
Могу ли я что-нибудь сделать для оптимизации нелинейной оптимизации?   -  person linearprogrammer    schedule 23.11.2018


Ответы (1)


Вы должны проверить вывод решателя, чтобы понять, почему он не работает. Вы можете вывести этот вывод на экран, добавив параметр 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.

person Bethany Nicholson    schedule 26.11.2018