2017-10-19 59 views
3

我正在使用CPLEX python API來解決優化問題。該模型被命名爲DOT。當我出現在Python控制檯運行DOT.solve(),許多信息:如何在使用CPLEX Python API後獲取流逝時間的值

Iteration log ... 
... 
Network - Optimal: Objective = 1.6997945303e+01 
Network time = 0.48 sec. (91.93 ticks) Iterations = 50424 (8674) 
... 

我的問題是,有一個簡單的方法來獲得的經過時間值(即,在我的情況0.48)?而不僅僅是網絡優化器,而是雙重方法,屏障方法。

我對Python和CPLEX非常新,我非常感謝任何幫助。

回答

1

要獲得總解決時間(掛鐘時間),可以使用get_time方法。要獲得「網絡時間」的值,如日誌輸出中所示,您必須解析日誌輸出。以下是一個演示這兩個例子:這應該給你如何從日誌中解析出其它信息的想法(這並不意味着是一個複雜的解析器的例子)

from __future__ import print_function 
import sys 
import cplex 


class OutputProcessor(object): 
    """File-like object that processes CPLEX output.""" 

    def __init__(self): 
     self.network_time = None 

    def write(self, line): 
     if line.find("Network time =") >= 0: 
      tokens = line.split() 
      try: 
       # Expecting the time to be the fourth token. E.g., 
       # "Network", "time", "=", "0.48", "sec.", ... 
       self.network_time = float(tokens[3]) 
      except ValueError: 
       print("WARNING: Failed to parse network time!") 
     print(line, end='') 

    def flush(self): 
     sys.stdout.flush() 


def main(): 
    c = cplex.Cplex() 
    outproc = OutputProcessor() 
    # Intercept the results stream with our output processor. 
    c.set_results_stream(outproc) 
    # Read in a model file (required command line argument). This is 
    # purely an example, thus no error handling. 
    c.read(sys.argv[1]) 
    c.parameters.lpmethod.set(c.parameters.lpmethod.values.network) 
    start_time = c.get_time() 
    c.solve() 
    end_time = c.get_time() 
    print("Total solve time (sec.):", end_time - start_time) 
    print("Network time (sec.):", outproc.network_time) 


if __name__ == "__main__": 
    main() 

您可能也有興趣get_dettime以及;它可以與get_time(如上所述)相同的方式使用,但不易受到機器負載的影響。

+0

我修改了我的代碼根據你的答案,它的工作,謝謝!但是我還有一個問題:總時間似乎比網絡時間長得多(例如1.72秒比0.56秒),那爲什麼(在「總時間」期間和「網絡時間」期間它在做什麼? ) – user12345

+0

Python API是Callable C庫的一個包裝。當您在Python API中調用solve時,會有額外的代碼來決定調用哪個優化例程(例如'CPXXmipopt','CPXXlpopt'等),並且優化結束時會檢查狀態代碼確定沒有發生錯誤,等等。這個額外的處理可能是你看到的差異。 「網絡時間」是Callable C Library自身報告的時間。你報告的差異比我看到的還要大,但是不知道更多關於你的模型/程序的內容,我不能說其他的東西。 – rkersh

+0

現在我有一個草圖的想法。謝謝。 – user12345

相關問題