【问题标题】:Violation of constraints in column generation algorithm, CPLEX java api在列生成算法中违反约束,CPLEX java api
【发布时间】:2014-05-02 11:55:36
【问题描述】:
我正在为一个大问题编写列生成算法,经过 5 次迭代后,该算法开始违反约束,确保所有 j 的 m(i,j)*x(i)=1 的 i 之和。我以前从未使用过 Cplex java Api,所以我想知道这是否是一个常见问题,即约束不成立?这是约束:
for( j=1; j <=K; j++) {
IloLinearNumExpr lhs = cplex.linearNumExpr();
for(i=1; i <= C; i++) {
lhs.addTerm(m[i][j], x[i]);
}
con[j] = cplex.addEq(lhs, 1);
con[j].setName("yourConstraintName(" + j + ")");
}
【问题讨论】:
标签:
java
constraints
mathematical-optimization
cplex
【解决方案1】:
这更有可能是代码逻辑中的缺陷。你给我们的代码 sn-p 对我来说看起来不错 - 如果没有更多上下文,我看不出问题出在哪里,知道 m 矩阵中的值是什么等。
首先,尝试使用 cplex.exportModel("name.lp") 将您的模型在每次迭代求解之前输出到 LP 文件。您可能需要为每次迭代创建一个新名称,例如在名称中包含迭代号,这样它们就不会每次都覆盖同一个文件。然后您可以检查文件中是否包含您期望的约束条件以及其中是否包含正确的术语。
其次,尝试在您的代码中添加一些老式日志记录,这样您就可以更详细地了解您的代码在做什么。
此外,您可能希望检查添加到表达式中的每个项中的系数值是否非零。在表达式中包含这些零项没有任何害处,但通常只有一小部分可能的项只有非零值,并且将所有这些项都放在那里会使表达式变得更大,更难在LP 文件。
CPLEX 在每个新版本发布之前都经过了非常详细的测试,它被全世界成千上万的公司和学者广泛使用和依赖,如果 CPLEX 提供的答案是一个常见问题,那就不会发生这种情况不尊重约束。