Gurobi:显然可行的模型会引发不可行的模型错误?

Gurobi: Apparently feasible model raises infeasible model error?

在有向图上调试更大流模型的实现时,我发现其中一个组件中存在一个奇怪的错误,该错误会通过 gurobi 产生不可行的模型错误。从可行性到不可行性的变化似乎是由于模型组成的唯一圆弧 (1,0) 的流动方向发生了变化。我只是无法理解这一点。请参阅下面的不可行模型 .lp-file

\ Model Model1
\ LP format - for model browsing. Use MPS format to capture full model detail.
Minimize

Subject To
 p_lb[0]: pressure[0] >= 10
 p_lb[1]: pressure[1] >= 10
 p_ub[0]: pressure[0] <= 80
 p_ub[1]: pressure[1] <= 80
 q_lb[1,0]: q[1,0] >= -100
 q_ub[1,0]: q[1,0] <= 100
 Flow_Balance[0]: q[1,0] = -50
 Flow_Balance[1]: - q[1,0] = 50
 short_cut2[1,0]: - pressure[0] + pressure[1] = 0
Bounds
End

整个问题暂时是可行性问题,所以我的objective是零。我在节点 0 和 1 处设置了有界压力变量,这是一个跨弧的流量变量,它出现在每个节点的流量平衡中。此外,我希望节点处的压力匹配。

我已将 .lp 文件和 .mps 文件放入我的 VSC 文本比较中,但除了流向外它们似乎没有什么不同。我有一种强烈的感觉,我可能忽略了一些东西。 下面还有两个流向的 .mps 文件。

可行的:

NAME Model1
ROWS
 N  OBJ
 G  p_lb[0] 
 G  p_lb[1] 
 L  p_ub[0] 
 L  p_ub[1] 
 G  q_lb[1,0]
 L  q_ub[1,0]
 E  Flow_Balance[0]
 E  Flow_Balance[1]
 E  short_cut2[1,0]
COLUMNS
    pressure[0]  p_lb[0]   1
    pressure[0]  p_ub[0]   1
    pressure[0]  short_cut2[1,0]  -1
    pressure[1]  p_lb[1]   1
    pressure[1]  p_ub[1]   1
    pressure[1]  short_cut2[1,0]  1
    q[1,0]    q_lb[1,0]  1
    q[1,0]    q_ub[1,0]  1
    q[1,0]    Flow_Balance[0]  1
    q[1,0]    Flow_Balance[1]  -1
RHS
    RHS1      p_lb[0]   10
    RHS1      p_lb[1]   10
    RHS1      p_ub[0]   80
    RHS1      p_ub[1]   80
    RHS1      q_lb[1,0]  -100
    RHS1      q_ub[1,0]  100
    RHS1      Flow_Balance[0]  50
    RHS1      Flow_Balance[1]  -50
BOUNDS
ENDATA

不可行的:

NAME Model1
ROWS
 N  OBJ
 G  p_lb[0] 
 G  p_lb[1] 
 L  p_ub[0] 
 L  p_ub[1] 
 G  q_lb[1,0]
 L  q_ub[1,0]
 E  Flow_Balance[0]
 E  Flow_Balance[1]
 E  short_cut2[1,0]
COLUMNS
    pressure[0]  p_lb[0]   1
    pressure[0]  p_ub[0]   1
    pressure[0]  short_cut2[1,0]  -1
    pressure[1]  p_lb[1]   1
    pressure[1]  p_ub[1]   1
    pressure[1]  short_cut2[1,0]  1
    q[1,0]    q_lb[1,0]  1
    q[1,0]    q_ub[1,0]  1
    q[1,0]    Flow_Balance[0]  1
    q[1,0]    Flow_Balance[1]  -1
RHS
    RHS1      p_lb[0]   10
    RHS1      p_lb[1]   10
    RHS1      p_ub[0]   80
    RHS1      p_ub[1]   80
    RHS1      q_lb[1,0]  -100
    RHS1      q_ub[1,0]  100
    RHS1      Flow_Balance[0]  -50
    RHS1      Flow_Balance[1]  50
BOUNDS
ENDATA

如果你能在黑暗中点亮一盏灯,我将不胜感激:)

默认情况下,所有变量的下限均为 0,但根据您的 Flow_Balance 约束,您正在设置 q[1,0] = -50。 要获得无界变量,您必须明确地将其下限设置为负无穷大。 (如何操作取决于您使用的 API。)

要调试此类不可行问题,您可以要求 Gurobi 计算一个不可约不一致子系统 (IIS)。当您从命令行(gurobi_cl)使用 运行 Gurobi 时,您可以通过指定 ResultFile=<filename>.ilp 来执行此操作(扩展名 ilp 告诉 Gurobi 计算和编写 IIS);在 Python 中,您将使用 computeIIS 方法。 例如。为您的不可行模型计算 IIS 会导致单个约束 q[1,0] = -50.