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