【问题标题】:CPU time in docplex - Pythondocplex 中的 CPU 时间 - Python
【发布时间】:2021-06-13 18:44:10
【问题描述】:

假设我已经在 python 中创建了一个数学模型,并希望使用下面的代码(docplex 库)来解决它。

start = time.perf_counter()  # CPU time calculator of the CPLEX solver
# Obj 1
mdl.minimize(obj1)
solution = mdl.solve(log_output=True)
if (solution is not None) and (solution.is_feasible_solution()):
    lb[0] = obj1.solution_value
    if obj2.solution_value > ub[1]: ub[1] = obj2.solution_value
    if obj3.solution_value > ub[2]: ub[2] = obj3.solution_value
    sol[0, 0] = obj1.solution_value
    sol[0, 1] = obj2.solution_value
    sol[0, 2] = obj3.solution_value
    sol[0, 3] = round(time.perf_counter() - start, 3)

既然我设置了mdl.time_limit=480,为什么sol[0, 3]中记录的时间会大于480秒?

谢谢!

【问题讨论】:

    标签: docplex cpu-time


    【解决方案1】:

    为了回答您最初的问题,time_limit 参数仅适用于 solve 调用,并由 CPLEX 在内部处理,专门计算求解时间。

    另一方面,Python time 模块以不同的方式计算时间,包括在调用 solve 之后但在第二次调用 time.time() 之前执行的 Python 代码

    【讨论】:

    • 谢谢!我知道了。但是,我还有一个问题。为什么要花费超过 480 次(我设定的求解模型的时间)?我已经看到在某些情况下需要 520 多秒。我认为我上面展示的操作不会那么耗时。
    • 我是否正确假设您的问题不是关于 CPLEX 求解时间,而是关于两次 time() 调用之间的额外时间?如果是这样,您能否通过添加对 time.time() 的中间调用来改进您的分析?在这两个类中,我看到了 minimize()is_solution_feasible() ,可能时间花在了那里,具体取决于您的模型大小。
    • 顺便说一句,为什么还要调用`is_solution_feasible()? Model.solve() 应该返回一个有效的解决方案,如果模型不可行,则返回 None。
    【解决方案2】:

    在 CPLEX docplex 中,您可以获得求解时间:

    from docplex.mp.model import Model
    
    mdl = Model(name='buses')
    nbbus40 = mdl.integer_var(name='nbBus40')
    nbbus30 = mdl.integer_var(name='nbBus30')
    mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
    mdl.minimize(nbbus40*500 + nbbus30*400)
    
    mdl.solve(log_output=True,)
    
    mdl.export("c:\\temp\\buses.lp")
    
    for v in mdl.iter_integer_vars():
        print(v," = ",v.solution_value)
    
    print(mdl.solve_details)
    print("solve time =",mdl.solve_details.time)
    

    给予

    status  = integer optimal solution
    time    = 0.109 s.
    problem = MILP
    gap     = 0%
    
    solve time = 0.10900000005494803
    

    【讨论】:

    猜你喜欢
    • 2021-08-23
    • 2017-04-09
    • 2013-02-17
    • 2020-10-30
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多