我正在使用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
,因为我认为这可能是一个舍入问题,但这没有效果。删除c1
或c3
约束类型也不会对生成的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 ++编译器。
非常感谢所有帮助!
→
答案 0 :(得分:1)
Kostja Siefen在Gurobi谷歌小组论坛上发现了这个问题:问题是我错误地认为I^D
变量的默认下限是-infinity,而Gurobi的默认下限是实际上是0.因此,通过将下限设置为-GRB_INFINITY
来解决问题。