«Ошибка приложения: Решатель (ipopt) не вышел нормально» после компиляции и установки ipopt самостоятельно

#anaconda #spyder #mingw-w64 #pyomo #ipopt

Вопрос:

Я пытался установить/скомпилировать ipopt на своем компьютере с Windows, и до сих пор у меня не было никакого прогресса. Я в основном следую инструкциям, перечисленным здесь: https://coin-or.github.io/Ipopt/INSTALL . Я скачал MSYS2 MinGW специально для этой цели.

В качестве зависимостей я загрузил следующее

  • OpenBLAS;
  • блис;
  • Третья сторона-ASL;
  • Третья сторона-HSL (с решателями библиотеки HSL, которые мне нужны);
  • Третья сторона-Свинка;

В конце концов, я попадаю ipopt.exe в C:msys64homemeIpoptsrcAppsAmplSolver папку. Но в папке есть еще ipopt.exe C:msys64homemeIpoptsrcAppsAmplSolver.libs один, поэтому я попытался использовать и то, и другое.

Я использую навигатор Anaconda и Pyomo, чтобы посмотреть, работают ли мои ipopt.exe работы, поэтому я помещаю результат ipopt.exe в AnacondaenvsmyenvLibrarybin папку. Однако исполняемый файл ipopt, который я получил, выдает мне ошибки. Один из них выдает мне ошибку, связанную с libipoptamplinterface-3.dll . Когда я запускаю приведенный ниже скрипт Python с помощью Spyder:

 import pyomo.environ as pyo
from pyomo.opt import SolverFactory
model = pyo.ConcreteModel()
model.nVars = pyo.Param(initialize=4)
model.N = pyo.RangeSet(model.nVars)
model.x = pyo.Var(model.N, within=pyo.Binary)
model.obj = pyo.Objective(expr=pyo.summation(model.x))
model.cuts = pyo.ConstraintList()
opt = SolverFactory('ipopt')
opt.solve(model) 

# Iterate, adding a cut to exclude the previously found solution
for i in range(5):
   expr = 0
   for j in model.x:
       if pyo.value(model.x[j]) < 0.5:
           expr  = model.x[j]
       else:
           expr  = (1 - model.x[j])
   model.cuts.add( expr >= 1 )
   results = opt.solve(model)
   print ("n===== iteration",i)
   model.display()
 

Я получаю такие ошибки, как эта:

 ERROR: Solver (ipopt) returned non-zero return code (127)
ApplicationError: Solver (ipopt) did not exit normally
 

Я не знаю, как это решить.

Комментарии:

1. Возможно, сначала проверьте, работает ли двоичный файл Ipopt только из командной строки. То есть сделайте make test это после make . Также не забудьте сделать make install . Вместо копирования двоичного файла Ipopt (и необходимых для этого библиотек DLL), возможно, просто укажите путь к установке Ipopt в свой ПУТЬ.

Ответ №1:

Ваша модель является типом оптимизации MILP, однако решатель ipopt не предназначен для этой цели, вместо этого используйте решатель glpk