1

我正在尝试让我的第一个 Pyomo 模型在我的 Ubuntu VM (Azure) 上运行。我在这台机器上安装了 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

4

1 回答 1

0

引发“catch-all”异常是因为求解器作为一个单独的非 Python 进程运行,因此 Python 真的无法判断它到底出了什么问题,它只是看到进程异常退出。

因此,求解器日志是要访问的东西,因为这是求解器本身写入其状态更新的地方,因此特定错误,无论是什么,都应该反映在那里。

如果求解器日志为空,这很可能意味着求解器根本无法启动(如果求解器进程使用流重定向运行,则在求解器命令被exec'd 之前打开日志文件——由此创建——所以这是程序启动出现问题时的常见症状)。既然pyomo是启动求解器的东西,那么在求解器启动时获得确切发生的细节就是答案所在。


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

如果这仍然没有产生任何启示,那么是时候拿出大炮了:

  • pyomo在下面运行pdb pyomo只是一个脚本,因此您可以将其传递给python -m pdb任何其他脚本;确保使用与python脚本的 shebang 中相同的可执行文件)并逐步执行pyomo机器中的代码以查看它对求解器进程的确切作用(什么信息它通过了,它如何调用它)
    • 如果存在(例如实际上没有传递任何信息),您将能够看到此过程中的缺陷,或者手动重复相同的操作以直接查看结果;和/或
  • 运行下面的命令strace -f(也监视求解器的子进程),看看是否有任何明显的错误,例如exec求解器命令的错误或打开文件的任何错误等。
于 2019-06-22T17:14:52.950 回答