Python 使用纸浆时,如何从古洛比解算器检索当前最佳解决方案?

Python 使用纸浆时,如何从古洛比解算器检索当前最佳解决方案?,python,gurobi,pulp,Python,Gurobi,Pulp,如果我在gurobi解算器中使用交互式解算器,我可以执行以下操作: gurobi> m = read('model.mp') gurobi> m.optimize() [...] Found heuristic solution: objective 821425.00000 然后中止并通过获取当前解决方案 gurobi> m.printAttr('X') 我想在果肉中有同样的行为。特别是在打过电话之后: prob = pulp.LpProblem(name="MIPPr

如果我在gurobi解算器中使用交互式解算器,我可以执行以下操作:

gurobi> m = read('model.mp')
gurobi> m.optimize()
[...]
Found heuristic solution: objective 821425.00000
然后中止并通过获取当前解决方案

gurobi> m.printAttr('X')
我想在果肉中有同样的行为。特别是在打过电话之后:

prob =  pulp.LpProblem(name="MIPProblem", sense=pulp.LpMaximize)
[...]
status = prob.solve(pulp.GUROBI_CMD(msg=True, keepFiles=1))

我想等待,直到第一个启发式解决方案在某个时间间隔后被找到/中止,然后获得Gurobi找到的当前最佳解决方案。我该怎么做呢?

您可以使用
纸浆.GUROBI
纸浆.GUROBI\u CDM

主要区别在于
plup.GUROBI
是对gurobipy(GUROBI-Python接口)的包装,而
plup.GUROBI\u CDM
使用命令行(即,它将LP/ILP写入文件,然后调用解算器)

让我们区分这两种情况:

  • 案例1
    纸浆。古罗比

    在这种情况下,可以访问solverModel对象。有关字段,您可以直接参考文档。但是,对于您的特定用例,您需要的是。
    一个小例子:

    import pulp
    
    ...
    
    status = prob.solve(pulp.GUROBI(timeLimit=1))
    
    print(pulp.LpStatus[status]) # status
    
    print(prob.solverModel.ObjBound) # best objective found
    
  • 案例2
    纸浆。古罗比尤CDM

    在这种情况下,通过命令行解决问题,并从结果文件(即)中读取解决方案

    请注意,GUROBI_CMD确实提供了良好的解决方案状态,因此即使解决方案不是最优的,您也可以阅读,因为GUROBI解决方案文件没有提供有关状态的信息


您可以使用
纸浆.GUROBI
纸浆.GUROBI\u CDM

主要区别在于
plup.GUROBI
是对gurobipy(GUROBI-Python接口)的包装,而
plup.GUROBI\u CDM
使用命令行(即,它将LP/ILP写入文件,然后调用解算器)

让我们区分这两种情况:

  • 案例1
    纸浆。古罗比

    在这种情况下,可以访问solverModel对象。有关字段,您可以直接参考文档。但是,对于您的特定用例,您需要的是。
    一个小例子:

    import pulp
    
    ...
    
    status = prob.solve(pulp.GUROBI(timeLimit=1))
    
    print(pulp.LpStatus[status]) # status
    
    print(prob.solverModel.ObjBound) # best objective found
    
  • 案例2
    纸浆。古罗比尤CDM

    在这种情况下,通过命令行解决问题,并从结果文件(即)中读取解决方案

    请注意,GUROBI_CMD确实提供了良好的解决方案状态,因此即使解决方案不是最优的,您也可以阅读,因为GUROBI解决方案文件没有提供有关状态的信息


问题目标是否有效?我认为您应该删除
status=
部分,尝试单独解决问题,然后使用
prob.objective
获得答案欢迎使用SO!如果您查看
纸浆解决方案的文档,您可以设置时间限制或允许的最佳差距。要在第一个可行的解决方案上停止,请设置一个非常大的最优性差距。@kabdulla但我可以举个例子,每隔t个时间打印当前的最佳解决方案,或者继续求解以获得更好的解决方案(重复此操作直到获得最佳解决方案)?如果我设置了一个时间限制或最优性间隔,但再次调用.solve(),它会从头开始,是吗?
prob.objective
有效吗?我认为您应该删除
status=
部分,尝试单独解决问题,然后使用
prob.objective
获得答案欢迎使用SO!如果您查看
纸浆解决方案的文档,您可以设置时间限制或允许的最佳差距。要在第一个可行的解决方案上停止,请设置一个非常大的最优性差距。@kabdulla但我可以举个例子,每隔t个时间打印当前的最佳解决方案,或者继续求解以获得更好的解决方案(重复此操作直到获得最佳解决方案)?如果我设置了一个时间限制或最优性间隔,但再次调用.solve(),它会从头开始,是吗?