当在有向图上调试更大的流模型的实现时,我发现其中一个组件中存在一个奇怪的错误,该错误会导致gurobi产生不可行的模型错误。从可行性到不可行性的变化似乎是由于模型所组成的唯一弧(1,0)的流向变化所致。我对此毫无意义。参见下面不可行的模型.lp文件
\ 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
整个问题目前都是可行性问题,因此我的目标是零。我在节点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 :(得分:1)
默认情况下,所有变量的下限均为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
。