Gurobi不可减少的子集ISS不包含冲突吗?

时间:2015-11-02 10:14:55

标签: linear-programming gurobi

我正在使用Gurobi的C ++接口来解决混合整数编程问题。这个模型看起来效果很好,但是当将结果与局部搜索启发式进行比较时,我发现一个简单的贪婪局部搜索产生了更好(和可行)的解决方案。为了查看导致问题的原因,我为一个小实例添加了一些额外的约束,强制解决方案与本地搜索过程找到的解决方案相同。

正如预期的那样,这导致了一个不可行的问题,我让Gurobi确定了不可约的子集(ISS)。但是,当手动检查生成的ISS 时,我发现方程式中没有冲突

问题是一个简单的多模式调度问题,其中x[i][m]是一个二进制变量,表示活动m的模式i的选择。因此,通过为每个活动选择单个模式来构建解决方案(= 1表示已经选择了模式,如约束c1所强制执行的)。 DEBUG约束应强制执行有关所有活动的活动模式的特定决策。

约束类型c2只是根据事件的优先级关系计算活动的完成时间,为每个活动的无约束的完成时间变量f[i]分配值。然后在c_linduration约束中使用最终活动的结束时间来计算由变量I^D表示的目标函数值(的一部分)。同样,I^D变量不受任何其他方程的约束(如果是,则约束当然也应存在于ISS中)。

Maximize

Subject To
 c1[1]: x[1][0] + x[1][1] + x[1][2] + x[1][3] = 1
 c1[2]: x[2][0] + x[2][1] + x[2][2] + x[2][3] = 1
 c1[5]: x[5][0] + x[5][1] + x[5][2] + x[5][3] + x[5][4] + x[5][5] + x[5][6]
   + x[5][7] = 1
 DEBUG[1]: x[1][1] = 1
 DEBUG[2]: x[2][0] = 1
 DEBUG[5]: x[5][2] = 1
 c2[1][0]: - 7.709549903869629 x[1][0] - 11.21389961242676 x[1][1]
   - 11.91479969024658 x[1][2] - 8.410420417785645 x[1][3] - f[0] + f[1]
   >= 0
 c2[2][0]: - 11.00800037384033 x[2][0] - 7.770349979400635 x[2][1]
   - 7.122819900512695 x[2][2] - 7.122819900512695 x[2][3] - f[1] + f[2]
   >= 0
 c2[5][0]: - 2.499399900436401 x[5][0] - 2.883919954299927 x[5][1]
   - 3.84522008895874 x[5][2] - 3.268440008163452 x[5][3]
   - 3.076179981231689 x[5][4] - 3.460700035095215 x[5][5]
   - 2.307130098342896 x[5][6] - 2.499399900436401 x[5][7] - f[2] + f[5]
   >= 0
 c2[7][1]: - f[5] + f[7] >= 0
 c3: f[0] = 0
 c_linduration: 0.2000000029802322 f[7] + I^D[0] = 4.390739887814817
Bounds
 x[1][0] free
 x[1][1] free
 x[2][0] free
 x[2][1] free
 -infinity <= x[2][2] <= 1
 -infinity <= x[2][3] <= 1
 x[5][2] free
 x[5][6] free
 f[0] free
 f[1] free
 f[2] free
 f[5] free
 f[7] free
Generals
 x[1][0] x[1][1] x[1][2] x[1][3] x[2][0] x[2][1] x[2][2] x[2][3] x[5][0]
 x[5][1] x[5][2] x[5][3] x[5][4] x[5][5] x[5][6] x[5][7]
End

我也尝试将整数精度从1e-9降低到1e-6,因为我认为这可能是一个舍入问题,但这没有效果。删除c1c3约束类型也不会对生成的ISS产生任何更改。我正在使用以下语句创建ISS:

//Optimize the model
model.optimize();

//calculate the ISS in case the model is infeasibel
model.computeIIS();
model.write("model.ilp");

是否有我可能错过的Gurobi设置或我可能会尝试的其他设置?或者我在构建这个国际空间站的方式有问题吗?我现在已经考虑了很长一段时间了,我真的不知道如何解决这个问题......如果重要的话,我正在使用Gurobi 6.0和OS X上的LLVM C ++编译器。

非常感谢所有帮助!

1 个答案:

答案 0 :(得分:1)

Kostja Siefen在Gurobi谷歌小组论坛上发现了这个问题:问题是我错误地认为I^D变量的默认下限是-infinity,而Gurobi的默认下限是实际上是0.因此,通过将下限设置为-GRB_INFINITY来解决问题。