You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:27:32