使用PuLp调用Gurobi求解MILP,超时后如何查看可行解?
解决PuLp调用Gurobi超时后获取可行解的方法
以下是在保留PuLp的前提下,获取Gurobi求解超时后找到的最优可行解的两种实用方法:
方法一:通过Gurobi结果文件读取可行解
在创建Gurobi求解器时,指定ResultFile参数,让Gurobi将求解过程中找到的最好可行解保存到.sol文件中,之后直接读取该文件提取变量值:
import pulp # 构建你的MILP模型 prob = pulp.LpProblem("MyModel", pulp.LpMinimize) # ... 变量、约束、目标函数定义 ... # 创建Gurobi求解器,设置时间限制和结果文件路径 solver = pulp.GUROBI(timeLimit=60, options={"ResultFile": "best_solution.sol"}) # 求解模型 prob.solve(solver) # 读取.sol文件获取变量值 with open("best_solution.sol", "r") as f: for line in f: if line.startswith("#") or not line.strip(): continue var_name, var_value = line.strip().split() print(f"{var_name}: {float(var_value)}")
方法二:通过PuLp访问底层Gurobi模型提取解
PuLp的GUROBI求解器对象可以直接访问底层的Gurobi模型实例,利用Gurobi的API获取当前找到的最优可行解,并赋值给PuLp的变量对象:
import pulp # 构建模型 prob = pulp.LpProblem("MyModel", pulp.LpMinimize) # ... 变量、约束、目标函数定义 ... # 创建求解器并设置时间限制 solver = pulp.GUROBI(timeLimit=60) prob.solve(solver) # 检查求解状态,若超时但存在可行解,提取变量值 if pulp.LpStatus[prob.status] in ["Feasible", "Not Optimal"]: # 遍历所有PuLp变量,从Gurobi模型中获取对应值 for var in prob.variables(): gurobi_var = solver.solverModel.getVarByName(var.name) var.varValue = gurobi_var.X # 打印变量值 print(f"{var.name}: {var.varValue}")
关键注意事项
- 确保Gurobi求解器版本与PuLp兼容,避免因版本差异导致底层模型访问失败。
- 若模型包含整数变量,Gurobi在超时后返回的可行解会是满足整数约束的整数解,无需额外处理。
内容的提问来源于stack exchange,提问作者NS13
相关产品推荐
相关产品推荐

