Java Cplex降低了最优性和第一个可行的解决方案

时间:2018-05-28 12:50:37

标签: java mathematical-optimization linear-programming cplex

我正在研究用Java编写的LP并使用cplex作为解算器。最佳解决方案需要一些时间才能找到。如果我有一个可行的解决方案可以更快地计算或只是一个具有降低的最优性的解决方案就足够了。

在CPLEX用户手册中,我找到了以下两个参数:

为了达到最佳性: https://www.ibm.com/support/knowledgecenter/SSSA5P_12.7.0/ilog.odms.cplex.help/CPLEX/Parameters/topics/EpOpt.html

cplex.setParam(IloCplex.Param.Simplex.Tolerances.Optimality, 1.0e-1);

对于第一个可行的解决方案:

cplex.setParam(IloCplex.Param.MIP.Limits.Solutions, 1);

我在我的模型中使用了这两个参数,但目标函数的解决方案与计算时间保持一致。

此外,我在下面的小LP中使用它们但没有成功。

package cplexTest;

import ilog.concert.*;
import ilog.cplex.*;

public class TestC {
    public static void main (String[] args) {
       model1();
}

   public static void model1() {
       try {
           IloCplex cplex = new IloCplex();
           cplex.setParam(IloCplex.Param.Simplex.Tolerances.Optimality, 1.0e-1);
           cplex.setParam(IloCplex.Param.MIP.Limits.Solutions, 100);

           //variables
           IloNumVar x = cplex.numVar(0, Double.MAX_VALUE, "x");
           IloNumVar y = cplex.numVar(0, Double.MAX_VALUE, "y");

           //expressions
           IloLinearNumExpr objective = cplex.linearNumExpr();
           objective.addTerm(0.12, x);
           objective.addTerm(0.15, y);

           // define objective
           cplex.addMinimize(objective);

           //define constraints
           cplex.addGe(cplex.sum(cplex.prod(60, x), cplex.prod(60, y)),300);
           cplex.addGe(cplex.sum(cplex.prod(12, x), cplex.prod(6, y)),36);
           cplex.addGe(cplex.sum(cplex.prod(10, x), cplex.prod(30, y)),90);

           //solve
           if (cplex.solve()) {
               System.out.println("obj = "+cplex.getObjValue());
               System.out.println("x = "+cplex.getValue(x));
               System.out.println("y = "+cplex.getValue(y));
           }
           else {
               System.out.println("Model not solved");
           }
       }
       catch (IloException exc) {
           exc.printStackTrace();
       }
   }
}

1 个答案:

答案 0 :(得分:1)

您可能应该发布日志以获得更好的答案,但我可以提出几点。

  1. LP一般快速解决。 MIP可能很慢。
  2. 如果您的LP非常大,请尝试使用内点法。对于大问题,内点(屏障)方法可以比原始或双单纯形法更快。内部点解算器也可以使用多个线程(单工是仅串行的)。
  3. 对于非常大的LP,您可能希望观察内存使用情况(特别是在使用并发LP方法时)。如果超过RAM大小,算法可能会开始“抖动”(因为通过虚拟内存使用磁盘IO而减慢速度)。因此关闭并发LP并仅使用最佳LP算法。
  4. 一般情况下,除非你有充分的理由这样做并且你知道自己在做什么,否则你不应该对降低成本容忍度进行修补。要找到一个可行点,请删除您的目标。您也可以考虑使模型更稀疏。
  5. 解决方案限制适用于MIP模型,而不适用于LP。