2014-05-02 26 views
0

我正在为一个大问题编写一个列生成算法,经过5次迭代后,算法开始违反约束,确保m(i,j) *对于所有j,x(i)= 1。我从来没有使用Cplex java Api,所以我想知道这是否是一个常见问题,那就是约束不成立?这是约束:违反列生成算法中的约束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 + ")");  
} 

回答

0

这是更有可能是你的代码的逻辑中的缺陷。你给我们的代码片段对我来说看起来还不错 - 我不知道问题出在哪里,没有更多的上下文,知道m矩阵中的值。

首先,在解决问题之前尝试输出模型它在每次迭代中使用cplex.exportModel(“name.lp”)将一个LP文件。您可能需要为每个迭代创建一个新名称,例如包括名称中的迭代编号,以便每次都不会覆盖同一个文件。然后你可以检查你所期望的约束是否在文件中,并且有正确的术语。其次,尝试在代码中添加一些老派日志记录,以便更详细地了解代码的功能。

此外,您可能需要检查在添加到表达式的每个术语中系数的值是否为非零。它不会在表达式中带有零项,但通常对于一小部分可能项只有非零值,并且所有这些项都会使表达式变得更大更难以检查LP文件。

CPLEX在每个新版本发布之前都进行了非常详细的测试,并且它被数千家公司和学术界广泛使用并依赖于这个词,如果这是常见问题,答案是CPLEX规定不尊重约束。