我有一个整数编程问题,例如这样,但有更多的变量和约束
它等于3SAT问题。没有对象函数,因此任何整数解都是最优的。
现在我可以找到一个带cplex的非整数解决方案,我想手动添加切割平面。我现在的问题是,我不确切知道如何在第一次放松后产生切口。我发现很多关于clique cut等的论文,但它们都是理论上的,并没有显示算法怎么做。我希望有人可以给我一个提示,如何产生这些削减并解决这个问题。
答案 0 :(得分:0)
我看到两个主要选择。使用用户剪切或延迟约束。
在这两种情况下,您都可以使用IloExpr
重新创建剪切的LHS,其中可以使用+=
运算符添加剪切上的变量,剪切将添加到IloModel
a先验或后验,换句话说,如果您检测到任何违规切割,您可以决定在.solve()
指令之前或之后添加用户剪切。通用行结构允许您使用以下两个选项之一一次添加一个甚至多个剪切:
cplex.addCut(IloConstraint cut)
cplex.addCuts(IloConstraintArray cuts)
假设要在剪切上添加的变量存储在IloIntArray VarInCut(env);
中,并且您在模型中使用IloNumVarArray x(env);
或IloIntVarArray x(env);
个变量,则可以构造{{1} }每行构造中cplex-C ++中的任何习惯约束:
IloConstraint cut
因此,在不等式/等式的情况下,将cut剪切为IloIntArray VarInCut(env);
IloExpr LHS;
for (int i=0; i<VarInCut.getSize(); i++) { LHS += x[VarInCut[i]]; }
或LHS <= RHS
剪切表达式,其中LHS == RHS
可以引用另一个RHS
或数字/整数值。< / p>
另一方面,Lazy Constraints通常被实现为CallBacks,它更加棘手,并且可能导致应用程序中出现错误行为的风险更高,因此调试起来更加困难。查看有关UserCuts,LazyConstraints以及几个博客here和here的CPLEX文档。
很高兴能为您服务!