Java Cplex пониженная оптимальность и первое выполнимое решение - PullRequest
0 голосов
/ 28 мая 2018

Я работаю над LP, написанным на Java, и использую 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);

Я использовал оба эти параметра в моей модели, но решение целевой функции остается таким же, как и время вычислений.

Кроме того, я использовал их в следующем небольшом альбоме, но безуспешно.

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 голосов
/ 28 мая 2018

Вы, вероятно, должны опубликовать журналы, чтобы получить лучшие ответы, но я могу сделать несколько замечаний.

  1. LP в целом решают быстро.MIP могут быть медленными.
  2. Если ваш LP очень большой, попробуйте метод внутренней точки.Для больших задач метод внутренней точки (барьер) может быть значительно быстрее, чем простой или двойной симплекс-метод.Внутренний решатель точек также может использовать несколько потоков (симплекс только последовательный).
  3. Для очень больших LP вы можете наблюдать за использованием памяти (особенно при использовании метода параллельных LP).Если вы превышаете объем оперативной памяти, алгоритм может начать «перебивать» (замедление из-за использования дискового ввода-вывода через виртуальную память).Поэтому отключите параллельную LP и используйте только лучший алгоритм LP.
  4. В общем, вам не следует возиться с уменьшенным допуском стоимости, если у вас действительно нет веских причин для этого и вы не знаете, что делаете.Чтобы найти только подходящую точку, удалите свою цель.Вы также можете посмотреть, как сделать модель более разреженной.
  5. Предел решения - для моделей MIP, а не для LP.
...