【问题标题】:MIQP to MILP linearization in Java Eclipse using Cplex concert使用 Cplex 音乐会在 Java Eclipse 中 MIQP 到 MILP 线性化
【发布时间】:2020-05-10 00:22:05
【问题描述】:

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

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

【问题讨论】:

  • 您好,欢迎来到 Stackoverflow!请将相关源代码附在您的问题中,并在您的空闲时间查看这里:codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question
  • Cplex 通常会自动线性化。
  • 您在这里问了完全相同的问题:developer.ibm.com/answers/questions/527282/… 这个问题缺少很多我们需要帮助您的细节:错误的答案是什么?解决方案不可行吗?它是次优还是超优?目标函数值是不同的还是只有 x 向量?你确定你的线性化是正确的吗?您可以编辑您的问题以显示线性化吗?和/或添加原始和线性化模型?
  • 您好 Erwin,Cplex 将自动线性化并解决它。但运行时间高于线性化约束。这些约束被添加为切割。使用 QP 目标和线性化约束,运行时间仅为 13 秒。而没有削减,中型问题的运行时间约为 900 秒。
  • 感谢您的回复,丹尼尔。对不起,我没有在这里分享细节。我现在会回答你所有的问题。

标签: java optimization mathematical-optimization cplex


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 2017-07-31
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多