Линеаризация MIQP в MILP в Java Eclipse с использованием концерта Cplex - PullRequest
0 голосов
/ 23 января 2020

Я кодирую в Eclipse, используя концертную технологию Cplex для решения задачи программирования Mixed Integer. Целевой функцией является QP (произведение двоичных файлов). Я хотел линеаризовать MIQP для MILP. Я ввел сокращения (ограничения) и закодировал их все в Java eclipse. Модель работает и завершается с неправильным ответом. Ранее модель MIQP запускалась без какого-либо линеаризованного целевого функционального члена, но с линеаризованными ограничениями. И MIQP, и MIQP с линеаризованными ограничениями дали одно и то же оптимальное решение. Но с новой настройкой это не заканчивается тем же решением. Мне нужна помощь в коде Cplex и Java для решения этой проблемы. Я предоставлю код по запросу.

Дополнительная информация, основанная на вводимых данных, выглядит следующим образом. Когда я говорю неправильный ответ, я пытаюсь объяснить следующее. У меня проблема MIQP с целевой функцией QP и линейными ограничениями. Когда я решил это в Cplex со всеми настройками по умолчанию в настройках параметров решателя, я получил оптимальное решение, скажем, за 900 секунд, и решение целевой функции, как, скажем, 200. Теперь я хочу улучшить формулировку и, следовательно, ввел некоторые линеаризованные ограничения (добавлены как сокращения и сохранил функцию QP obj. как есть и снова решил. На этот раз я получил то же самое оптимальное решение 200 со временем выполнения всего 13 с. Теперь я хочу ввести в задачу выражение (произведение двоичных файлов = квадратичные c) как простой бинарной переменной) и решил проблему. Алгоритм завершился всего за 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");
                }
            }
        }

1 Ответ

0 голосов
/ 11 февраля 2020

Общий ответ не может быть дан, так как не вся информация для воспроизведения проблемы доступна. Поэтому я превращаю один из моих комментариев в ответ, чтобы проиллюстрировать, как вы можете отлаживать это самостоятельно:

Для отладки я предлагаю назначить имена всем переменным и ограничениям, а затем экспортировать в файл LP. Затем посмотрите на этот файл LP и убедитесь, что линеаризация обнаруживается, как и ожидалось. Если это сделано, то взгляните на векторы решения супероптимального решения. Там будут некоторые значения, которые являются неправильными. Посмотрите на ограничения, которые должны исключать эти неправильные значения. Может быть проблема с этими ограничениями.

...