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
.
在有向图上调试更大流模型的实现时,我发现其中一个组件中存在一个奇怪的错误,该错误会通过 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
.