3

我正在使用COIN-OR的CBC求解器来解决一些数值优化问题。我通过PuLP构建了Python中的优化问题。写COIN-OR CBC日志文件

我注意到像GUROBI和CPLEX这样的求解器创建日志文件,但我似乎无法弄清楚如何让CBC创建一个日志文件(而不是将优化器的进度打印到屏幕上)。

有没有人知道CBC中的一个选项来设置日志文件?将所有stdout重定向到一个文件对我来说不起作用,因为我并行地解决了一堆问题,并希望将它们的日志文件分开。

下面是我打电话给求解器的例子。这工作很好,并将进度打印到终端。

prob.solve(pulp.COIN_CMD(msg=1, options=['DivingVectorlength on','DivingSome on'])) 

以下是我认为一个解决方案的结构应(虽然明显LOGFILENAME不是一个有效的CBC选项)。

prob.solve(pulp.COIN_CMD(msg=1, options=['DivingVectorlength on', 'DivingSome on', 'LogFileName stats.log'])) 

对此的任何帮助将不胜感激。我一直在浏览互联网,文档和CBC互动会话数小时,试图弄清楚这一点。

回答

1

仅适用于需要的代码脚本调用纸浆和CBC几行的解决方案,请参阅https://groups.google.com/forum/#!topic/pulp-or-discuss/itbmTC7uNCQ由詹姆斯·沃格尔的解决方案(https://github.com/voglster,也许),基于os.dup()os.dup2()

我希望在这里复制它以防止出现linkrot是不合适的,但请参阅原始帖子中的逐行解释以及一些我从tempfile软件包中无法理解的复杂的东西。我自己的使用是不太成熟,使用实际永久文件名:

from os import dup, dup2, close 
f = open('capture.txt', 'w') 
orig_std_out = dup(1) 
dup2(f.fileno(), 1) 

status = prob.solve (PULP_CBC_CMD(maxSeconds = i_max_sec, fracGap = d_opt_gap, msg=1)) # CBC time limit and relative optimality gap tolerance 
print('Completion code: %d; Solution status: %s; Best obj value found: %s' % (status, LpStatus[prob.status], value(prob.objective)))  

dup2(orig_std_out, 1) 
close(orig_std_out) 
f.close() 

这使你在当前目录下capture.txt有用的信息。

+0

以这种方式重定向stdout是正确的举动 - 谢谢! – Andrew 2018-02-04 15:46:52

1

我无法找到在不改变pulp源代码的答案,但如果不打扰你,然后采取以下途径:

导航到你的纸浆的目录中安装库,并期待在solvers.py文件。

感兴趣的功能是在COIN_CMD类中的solve_CBC。在该方法中,参数形成单个命令传递给cbc-64解算器程序,然后使用subprocess.Popen方法调用它。该方法的参数stdout要么设置为Noneos.devnull,这两个参数对我们都不是很有用。你可以在1340行看到进程调用(对于PuLP 1.5.6)。

cbc = subprocess.Popen((self.path + cmds).split(), stdout = pipe, 
        stderr = pipe) 

该人士还揭示了问题(MPS)和溶液(sol)文件写入到/tmp目录(在UNIX机器),而且文件名包含解释的pid调用它。我使用这个ID打开一个文件并将其传递给该参数。像这样:

logFilename = os.path.join(self.tmpDir, "%d-cbc.log" % pid) 
logFile = open(logFilename, 'a') 
cbc = subprocess.Popen((self.path + cmds).split(), stdout = logFile, 
        stderr = pipe) 

果然,在/tmp目录我看到后跑我的日志文件。您可以使用​​来设置详细信息,请参阅cbc帮助以获取更多文档。由于这会为每个进程ID创建一个不同的文件,我认为它可以解决您并行运行多个解算器的问题。

+0

迈克,这也是一个很好的解决方案 - 谢谢你的方法! – Andrew 2018-02-04 15:50:30