【问题标题】:How to implement time limit in Docplex如何在 Docplex 中实现时间限制
【发布时间】:2021-10-06 10:50:34
【问题描述】:

我正在使用具有最小化目标的 Docplex(Cplex python 版本)。由于找到最佳解决方案需要很长时间,我想设置一个时间限制并在那时收到找到的解决方案。 为了限制时间,我尝试了以下方法,但它不起作用。 谁能给我一个关于如何实现它的提示?

import docplex.cp.parameters as params
 
def solve_model():
     params.timelimit = 1
     result = model.solve()     

我也试过 model.parameters.timelimit = 1

我没有收到任何错误。模型求解正确,但超出时限。

【问题讨论】:

  • docplex.cp 涉及用于约束规划的 CPO 求解器,而不是 CPLEX

标签: python constraint-programming docplex time-limiting


【解决方案1】:

希望对你有用。

def main():
    # Create the model
    model = Model(name='buses')

    # Create decision variables
    x = {(i, j): model.binary_var(name='x_{0}_{1}'.format(i, j)) for i in range(n) for j in range(n)}

    # Create objective
    obj = model.sum(c[i][j] * x[i, j] for i in range(n) for j in range(n))
    model.minimize(obj)

    # Add constraints
    for i in range(n):
        model.add_constraint(model.sum(x[i, j] for j in range(n)) == 1)
        model.add_constraint(model.sum(x[j, i] for j in range(n)) == 1)

    # Add time limit
    model.context.solver.time_limit = 30

    # Solve the model
    solution = model.solve()

    # Print solution
    if solution:
        print_solution(solution, x)


def print_solution(solution, x):
    print('Total cost = ', solution.objective_value)
    for i in range(n):
        for j in range(n):
            if solution[x[i, j]] > 0:
                print('x{0}_{1} = '.format(i, j), solution[x[i, j]])


if __name__ == '__main__':
    main()

【讨论】:

  • 感谢您的快速回复!我以这种方式实现了它,但不幸的是,在求解模型时仍然超出了时间限制。我必须添加/导入其他东西吗?
  • 抱歉,时间有点久了,记不太清了。 ://
【解决方案2】:

optimization simple in python

https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoosettings.py

from docplex.mp.model import Model

mdl = Model(name='buses')

mdl.parameters.timelimit=20;
mdl.set_time_limit(20) #The same

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()

mdl.export("c:\\temp\\buses.lp")

print("time limit = ",mdl.parameters.timelimit.get())
print("time limit = ",mdl.get_time_limit()) #The same

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)

【讨论】:

    猜你喜欢
    • 2019-08-31
    • 1970-01-01
    • 2021-08-23
    • 2020-03-22
    • 1970-01-01
    • 2021-06-13
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多