要獲得總解決時間(掛鐘時間),可以使用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
(如上所述)相同的方式使用,但不易受到機器負載的影響。
我修改了我的代碼根據你的答案,它的工作,謝謝!但是我還有一個問題:總時間似乎比網絡時間長得多(例如1.72秒比0.56秒),那爲什麼(在「總時間」期間和「網絡時間」期間它在做什麼? ) – user12345
Python API是Callable C庫的一個包裝。當您在Python API中調用solve時,會有額外的代碼來決定調用哪個優化例程(例如'CPXXmipopt','CPXXlpopt'等),並且優化結束時會檢查狀態代碼確定沒有發生錯誤,等等。這個額外的處理可能是你看到的差異。 「網絡時間」是Callable C Library自身報告的時間。你報告的差異比我看到的還要大,但是不知道更多關於你的模型/程序的內容,我不能說其他的東西。 – rkersh
現在我有一個草圖的想法。謝謝。 – user12345