0

让我们假设我已经在 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 秒?

谢谢!

4

2 回答 2

1

在 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-03-16T14:02:50.510 回答
1

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

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

于 2021-03-16T17:13:03.233 回答