违反列生成算法CPLEX java api中的约束
我正在为一个大问题编写一个列生成算法,经过5次迭代后,该算法开始违反约束,确保所有j的mi,j*xi=1。我以前从未使用过cplexjavaapi,所以我想知道这是否是一个常见的问题,即约束不成立?以下是限制条件:违反列生成算法CPLEX java api中的约束,java,constraints,mathematical-optimization,cplex,Java,Constraints,Mathematical Optimization,Cplex,我正在为一个大问题编写一个列生成算法,经过5次迭代后,该算法开始违反约束,确保所有j的mi,j*xi=1。我以前从未使用过cplexjavaapi,所以我想知道这是否是一个常见的问题,即约束不成立?以下是限制条件: for( j=1; j <=K; j++) { IloLinearNumExpr lhs = cplex.linearNumExpr(); for(i=1; i <= C; i++) { lhs.addTerm(m[i][j], x[i]); }
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 + ")");
}
这很可能是代码逻辑中的一个缺陷。你给我们的代码片段在我看来还行——如果没有更多的上下文,不知道m矩阵中的值是什么,我看不出问题出在哪里 首先,在每次迭代求解模型之前,尝试使用cplex.exportModelname.LP将模型输出到LP文件。您可能需要为每个迭代创建一个新名称,例如,在名称中包含迭代编号,这样他们就不会每次都覆盖同一个文件。然后,您可以检查所需的约束是否在文件中,并且是否包含正确的术语 其次,尝试在代码中添加一些老式的日志记录,这样您就可以更详细地了解代码正在做什么 此外,您可能希望检查添加到表达式中的每个项中的系数值是否为非零。在表达式中使用这些零项并没有任何害处,但通常只有一小部分可能的项具有非零值,并且所有这些项都存在会使表达式更大,更难在LP文件中检查 CPLEX在每一个新版本发布之前都经过了非常详细的测试,它被世界各地数千家公司和学者广泛使用和依赖,如果CPLEX提供的答案不尊重约束条件,这是一个常见问题,那么就不可能发生