Gurobi中能否获取不可行LP对偶问题的极射线?
解决不可行LP对偶极射线的Gurobi方法
好问题!刚好我对Gurobi处理这类情况的方式很熟悉,完全不需要手动对偶化问题就能获取对偶的极射线,具体操作如下:
当你的原LP问题求解后返回GRB.INFEASIBLE状态时,根据强对偶定理,对偶问题必然无界。Gurobi内置了直接获取对偶极射线的属性,不需要你手动构建对偶模型。
具体Python实现步骤
- 先求解你的原模型:
model.optimize()
- 检查求解状态是否为不可行,若不可行则获取对偶极射线相关属性:
import gurobipy as gp from gurobipy import GRB # 假设你已经构建好model对象 model.optimize() if model.status == GRB.INFEASIBLE: # 获取原线性约束对应的对偶射线部分 farkas_dual = model.getAttr("FarkasDual", model.getConstrs()) # 获取变量下界约束对应的对偶射线部分 farkas_lower = model.getAttr("FarkasLower", model.getVars()) # 获取变量上界约束对应的对偶射线部分 farkas_upper = model.getAttr("FarkasUpper", model.getVars())
属性说明
FarkasDual:对应原问题中所有线性约束(比如Ax <= b这类)的对偶变量值,构成对偶极射线的核心部分。FarkasLower&FarkasUpper:分别对应原问题中变量的下界(x >= lb)和上界(x <= ub)约束的对偶变量值,补全对偶极射线的完整方向。
这些属性返回的值组合起来,就是对偶无界问题的极射线方向——它满足对偶问题的所有约束,并且能让对偶目标函数趋向无穷(具体是正无穷还是负无穷,取决于原问题的目标类型是最大化还是最小化)。
需要注意的是,Gurobi 7.5.2完全支持这些属性,和Python 3.6的兼容性也没问题,直接用就好。
内容的提问来源于stack exchange,提问作者Matthias Aschenbrenner
相关产品推荐
相关产品推荐

