Я кодирую в 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");
}
}
}