如何用Python+CPLEX获取LP解的相对/绝对间隙?PuLP调用问题求助
获取PuLP中MIP问题的相对间隙的可行方法
你提到的solution.MIP.get_mip_relative_gap()并非PuLP的标准方法,所以无法运行。以下是几种可行的获取方式:
方法一:解析CBC求解器日志(默认求解器适用)
CBC求解器会在日志中输出相对间隙,只需开启日志并解析即可:
from pulp import LpProblem, LpMinimize, LpVariable, CBC_CMD # 构建你的MIP问题(示例) prob = LpProblem("SampleMIP", LpMinimize) x = LpVariable("x", lowBound=0, cat="Integer") y = LpVariable("y", lowBound=0, cat="Integer") prob += 3*x + 5*y prob += 2*x + y >= 10 prob += x + 2*y >= 10 # 启用日志输出并指定保存路径 solver = CBC_CMD(msg=True, logPath="cbc_log.txt") prob.solve(solver) # 从日志中提取相对间隙 with open("cbc_log.txt", "r") as log_file: for line in log_file: if "Relative gap" in line: gap_value = float(line.split(":")[-1].strip()) print(f"MIP相对间隙: {gap_value}")
方法二:直接调用商业求解器API(如Gurobi/CPLEX)
如果使用Gurobi等商业求解器,可以直接访问底层模型的属性获取间隙:
from pulp import LpProblem, LpMinimize, LpVariable, GUROBI # 构建你的MIP问题 prob = LpProblem("SampleMIP", LpMinimize) x = LpVariable("x", lowBound=0, cat="Integer") y = LpVariable("y", lowBound=0, cat="Integer") prob += 3*x + 5*y prob += 2*x + y >= 10 prob += x + 2*y >= 10 # 使用Gurobi求解 solver = GUROBI(msg=True) prob.solve(solver) # 直接获取相对间隙 relative_gap = prob.solverModel.MIPGap print(f"MIP相对间隙: {relative_gap}")
方法三:手动计算间隙
若无法通过日志或求解器API获取,可手动计算:
相对间隙公式:|整数解目标值 - 松弛解目标值| / |整数解目标值|
from pulp import LpProblem, LpMinimize, LpVariable, CBC_CMD # 构建你的MIP问题 prob = LpProblem("SampleMIP", LpMinimize) x = LpVariable("x", lowBound=0, cat="Integer") y = LpVariable("y", lowBound=0, cat="Integer") prob += 3*x + 5*y prob += 2*x + y >= 10 prob += x + 2*y >= 10 # 求解MIP问题 prob.solve(CBC_CMD(msg=True)) integer_obj = prob.objective.value() # 求解线性松弛问题 relaxed_prob = prob.relax() relaxed_prob.solve(CBC_CMD(msg=False)) relaxed_obj = relaxed_prob.objective.value() # 计算相对间隙 if abs(integer_obj) > 1e-9: # 避免除以零 relative_gap = abs(integer_obj - relaxed_obj) / abs(integer_obj) else: relative_gap = abs(integer_obj - relaxed_obj) print(f"MIP相对间隙: {relative_gap}")
注意事项
- CBC作为默认开源求解器,仅支持日志解析或手动计算;商业求解器提供更直接的API。
- 确保求解过程已找到可行的整数解和松弛解,否则计算结果无意义。
内容的提问来源于stack exchange,提问作者user21559
相关产品推荐
相关产品推荐

