Ошибка при использовании IPOPT в Python на Windows и сервере NEOS - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь запустить код для сложной модели, который был переведен с GAMS на Python (DICE16). Требуются pyomo и ipopt, но есть проблема с ipopt на Windows 10 (64-битная), поскольку conda-forge устанавливает только версию 3.10.1, которая не работает с моим кодом:

ERROR: Solver (ipopt) returned non-zero return code (1)
ERROR: Solver log: Ipopt 3.11.1: halt_on_ampl_error=yes acceptable_tol=1e-08
    constr_viol_tol=1e-10 max_iter=2000 bound_frac=0.1


    **************************************************************************
        **** This program contains Ipopt, a library for large-scale nonlinear
        optimization.
     Ipopt is released as open source code under the Eclipse Public License
     (EPL).
             For more information visit http://projects.coin-or.org/Ipopt
    **************************************************************************
        ****

    NOTE: You are using Ipopt by default with the MUMPS linear solver.
          Other linear solvers might be more efficient (see Ipopt
          documentation).


    This is Ipopt version 3.11.1, running with linear solver mumps.

    Number of nonzeros in equality constraint Jacobian...:     6445 Number of
    nonzeros in inequality constraint Jacobian.:        0 Number of nonzeros
    in Lagrangian Hessian.............:      984

    Error evaluating constraint 901: can't compute 0/0.
---------------------------------------------------------------------------
ApplicationError                          Traceback (most recent call last)
<ipython-input-5-759fa6ac1706> in <module>
      3 with open("DICE16_PF.py") as f:
      4     code = compile(f.read(), "DICE16_PF.py", 'exec')
----> 5     exec(code)
      6

~\Desktop\VKR\DICE16_PF.py in <module>
    575         solver.options['bound_frac'] = 0.1
    576         #solver.options['bound_relax_factor'] = 0
--> 577         results = solver.solve(m)#,tee=True)
    578         print(sorted(m.t))
    579         print(m.OBJ.expr.value)

~\Anaconda3\lib\site-packages\pyomo\opt\base\solvers.py in solve(self, *args, **kwds)
    598                     logger.error("Solver log:\n" + str(_status.log))
    599                 raise pyutilib.common.ApplicationError(
--> 600                     "Solver (%s) did not exit normally" % self.name)
    601             solve_completion_time = time.time()
    602             if self._report_timing:

ApplicationError: Solver (ipopt) did not exit normally

Этот код работает на Linux или IOS, так как они имеют последние версии IPOPT, поэтому код не включает деление на 0.

Я пытался использовать IPOPT через NEOS сервер, но он тоже не работал:

NameError                                 Traceback (most recent call last)
<ipython-input-3-759fa6ac1706> in <module>
      3 with open("DICE16_PF.py") as f:
      4     code = compile(f.read(), "DICE16_PF.py", 'exec')
----> 5     exec(code)
      6

~\Desktop\VKR\DICE16_PF.py in <module>
    575         # solver.options['bound_frac'] = 0.1
    576         # #solver.options['bound_relax_factor'] = 0
--> 577         results = solver.solve(m)#,tee=True)
    578         print(sorted(m.t))
    579         print(m.OBJ.expr.value)

NameError: name 'solver' is not defined

Я также пытался изменить имя решателя на IPOPT, Ipopt или даже conopt и bonmin, но проблема остается той же.

Вот часть кода, где я использую Ipopt (или conopt): часть кода

Что я должен сделать, чтобы это исправить? Я новичок во всем этом, поэтому извините, если мой вопрос звучит глупо.

...