“ Solver无法正常退出”-Jupyter / Python3 / Ubuntu

时间:2019-06-16 12:31:40

标签: python ubuntu pyomo coin-or

我正在尝试在Ubuntu VM(Azure)上运行我的第一个Pyomo模型。我在此机器上安装了Python3和COIN-OR求解器。无论我尝试使用哪种求解器,都可以得到相同的结果。

编辑:将求解器更改为couenne(这是一个非线性问题),Jupyter输出如下所示。当我打开tmp目录中的日志文件时,couenne.log文件中没有任何内容,而pyomo文件就是问题的表述。所以我认为Pyomo根本不与Couenne求解器通信?

Solver log file: '/tmp/tmpezw0sov2_couenne.log'
Solver solution file: '/tmp/tmpq6afa7e8.pyomo.sol'
Solver problem files: ('/tmp/tmpq6afa7e8.pyomo.nl',)
ERROR: Solver (asl) returned non-zero return code (-1)
ERROR: See the solver log above for diagnostic information.
---------------------------------------------------------------------------
ApplicationError                          Traceback (most recent call last)
<ipython-input-6-486e3a9173f4> in <module>()
     20 #instance = model.create_instance()
     21 opt = SolverFactory('couenne', executable = solverpath_exe)
---> 22 opt.solve(model,tee=True,keepfiles=True)
     23 #solver=SolverFactory(solvername,executable=solverpath_exe)

/home/ralphasher/.local/lib/python3.6/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 (asl) did not exit normally

1 个答案:

答案 0 :(得分:0)

引发“包罗万象”异常是因为求解程序是作为一个单独的非Python进程运行的,因此Python确实无法分辨出它到底出了什么问题,它只是看到该进程已异常退出。 / p>

因此,求解器日志是必须解决的事情,因为这是求解器本身写入其状态更新的地方,因此,无论发生什么具体错误,都应在其中反映出来。

如果求解器日志为空,则很可能意味着求解器根本无法启动(如果使用流重定向运行求解器进程,则在求解器命令{{ 1}},因此,这是程序启动时出现的常见症状。由于exec是启动求解器的事物,因此答案的出处在于获取求解器启动时确切发生的情况的详细信息。


根据pyomo solve command — Pyomo 5.6.6 documentation,您可以使用pyomo--info命令行选项来增加--verbose日志的详细程度。

如果那仍然无法产生任何启示,那么就该抽出大手枪了:

    pyomo下运行
  • pyomo pdb只是一个脚本,因此您可以像其他任何脚本一样将其传递给pyomo;请确保使用相同的{ {1}}(如脚本的shebang中的可执行文件),并逐步通过python -m pdb机制中的代码来查看其对求解器进程的确切作用(传递的信息,调用方式)
    • 如果有(例如,实际上没有传递任何信息),您将能够看到此过程中的缺陷,或者手动重复相同的操作以第一手看到结果;和/或
  • python下运行命令(以监视求解程序的子进程),并查看是否存在任何明显的错误,例如pyomo的错误,或者打开文件等错误。 / li>