繁体   English   中英

使用 Cplex Concert 在 Java Eclipse 中将 MIQP 线性化为 MILP

[英]MIQP to MILP linearization in Java Eclipse using Cplex concert

我正在使用 Cplex Concert 技术在 Eclipse 中编码来解决混合整数编程问题。 目标函数是 QP(二进制文件的乘积)。 我想将 MIQP 线性化为 MILP。 我引入了削减(约束)并将它们全部编码在 Java eclipse 中。 该模型正在运行并以错误的答案终止。 早些时候,MIQP 模型在没有任何线性化目标函数项但具有线性化约束的情况下运行。 MIQP 和具有线性化约束的 MIQP 都给出了相同的最优解。 但是使用新设置,它不会以相同的解决方案终止。 我需要 Cplex 代码和 Java 代码中的一些帮助来解决这个问题。 我将根据要求共享代码。

基于输入的附加信息如下 当我说错答案时,我试图解释的内容如下。 我有一个带有 QP 目标函数和线性约束的 MIQP 问题。 当我在 Cplex 中使用求解器参数设置中的所有默认设置解决此问题时,我在 900 秒内获得了最佳解决方案,目标函数解决方案为 200 秒。现在我想改进公式,因此引入了一些线性化约束(作为削减添加并保持 QP obj. 函数原样并再次求解。这次我得到了相同的最优解 200,运行时间仅为 13 秒。现在我想将目标中的(二进制乘积 = 二次项作为简单二进制引入变量)并解决了问题。该算法在 obj.function value -649199 something 的 10 秒内终止。我的线性化是正确的。我检查了数学。下面的代码将分享有关 Java 代码的详细信息。

目标函数IloNumExpr fullexpr = cplex.numExpr();

        for(int t=1; t<timeLimit; t++) {
            for(int l=0; l<limitD[t]; l++) {
                for (int q=0;q<limitD[t];q++) {

                // creating expressions and adding to objective function
                double p1l = (delta/2)*(d1LT[t].density((l+.5)*delta)+d1LT[t].density((l+1.5)*delta));                      
                double lDp1l = (l+1)*p1l*delta;
                IloNumExpr expr1 = cplex.prod(h1, cplex.sum(-lDp1l, cplex.prod(p1l, S1[t])));

                double pplushprime = p+h1prime; 
                IloNumExpr expr3 = cplex.prod(pplushprime, cplex.sum(cplex.prod(lDp1l,cplex.sum(1, cplex.prod(-1, y[l][t]))),cplex.prod(p1l,cplex.prod(-1, S1[t]))));
                IloNumExpr expr4 = cplex.prod(pplushprime, cplex.prod(delta*p1l, E[l][q][t]));
                fullexpr = cplex.sum(fullexpr, expr1, expr3, expr4);
                }
            }
        }

线性化约束

      for(int t=0; t<timeLimit;t++ {
          for(int l=0; l<limitD[t]; l++) {
              for(int q=0; q<limitD[t]; q++) {
                  cplex.addLe(cplex.sum(y[l][t],y1[q][t]),cplex.sum(cplex.prod(2, E[l][q][t]),1) ,"new1");
                  cplex.addGe(cplex.sum(y[l][t],cplex.prod(-1, y1[q][t])),cplex.sum(cplex.prod(1, E[l][q][t]),-1),"new2");                      
                  cplex.addGe(cplex.sum(y1[q][t],cplex.prod(-1, y[l][t])),cplex.sum(cplex.prod(1, E[l][q][t]),-1),"new3");
                  cplex.addGe(cplex.sum(y[l][t],y1[q][t]),cplex.prod(1, E[l][q][t]),"new4");
                }
            }
        }

无法给出一般性答案,因为并非所有重现问题的信息都可用。 因此,我将我的一条评论变成了一个答案,以说明您如何自己调试它:

为了进行调试,我建议为所有变量和约束分配名称,然后导出到 LP 文件。 然后查看此 LP 文件并确保线性化按预期显示。 如果这样做了,那么看看超最优解的解向量。 会有一些不正确的值。 查看应该排除这些不正确值的约束。 这些约束可能存在问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM