CpxObjective для общих выражений: Исключение Cplex с моделью решения Quadrati c - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь минимизировать функцию: квадратичную c сумму функции (sum (w * a) -v) ^ 2

, представляющую собой квадратный массив "a" и два "w" и "v" два векторы. «а» и «v» известны, «w» неизвестен. Я использую CPLEX в Java

double [][] input =  {{1,2},{3,4}};
double[] result = {3,2};

//define new model
IloCplex cplex = new IloCplex();

// variables
IloNumVar[] w = new IloNumVar[input[0].length];
for (int i = 0; i < w.length; i++) {
    w[i] = cplex.numVar(0.0, 1.0, IloNumVarType.Float);
}           

IloNumExpr value = cplex.numExpr();
IloNumExpr objective = cplex.numExpr();

for (int i = 0; i < result.length; i++) {

    for (int j = 0; j < result.length; j++) {
        value = cplex.sum(value, cplex.prod(input[i][j], w[i]));
    }
    value = cplex.diff(value, result[i]);
    value = cplex.square(value);

    objective = cplex.sum(objective, value);
}

, но у меня есть исключение, которого я не понимаю:

Exception in thread "main" java.lang.UnsupportedOperationException: CpxObjective for general expressions
at ilog.cplex.CpxObjective.setExpr(CpxObjective.java:102)
at ilog.cplex.CpxObjective.<init>(CpxObjective.java:357)
at ilog.cplex.IloCplexModeler.objective(IloCplexModeler.java:796)
at ilog.cplex.IloCplexModeler.minimize(IloCplexModeler.java:714)
at ilog.cplex.IloCplexModeler.minimize(IloCplexModeler.java:810)
at Tont.main(Tont.java:55)

Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Насколько я могу судить, ваша первая итерация внешнего l oop создает такие термины, как w[i]^2. Вторая итерация внешних циклов затем берет это выражение и возводит его в квадрат. Таким образом создавая термины типа w[i]^2. Это не поддерживается Поддерживаются только показатели 1 и 2 (линейные и квадратичные c цели).

Из того, что вы написали, я думаю, что вы не создаете свое объективное право. Это должно выглядеть примерно так (обратите внимание на инициализацию value, перемещенную в l oop):

  for (int i = 0; i < result.length; i++) {
     IloNumExpr value = cplex.numExpr();
     for (int j = 0; j < result.length; j++) {
        value = cplex.sum(value, cplex.prod(input[i][j], w[i]));
     }
     value = cplex.diff(value, result[i]);
     value = cplex.square(value);

     objective = cplex.sum(objective, value);
  }
0 голосов
/ 28 апреля 2020

Это полный код, но он невозможен. потому что Cplex не может решить такие проблемы?

double [][] input =  {{1,2},{3,4}};
double[] result = {3,2};

// define new model
IloCplex cplex = new IloCplex();

//cplex.setParam(IloCplex.Param.RootAlgorithm, IloCplex.Algorithm.Auto);

// variables
IloNumVar[] w = cplex.numVarArray(input[0].length, 0, Float.MAX_VALUE);// new IloNumVar[input[0].length];
for (int i = 0; i < w.length; i++) {
    w[i] = cplex.numVar(0.0, 1.0, IloNumVarType.Float);
}           

//IloNumExpr value = cplex.numExpr();
IloNumExpr objective = cplex.numExpr();


  for (int i = 0; i < result.length; i++) {
         IloNumExpr value = cplex.numExpr();
         for (int j = 0; j < result.length; j++) {
            value = cplex.sum(value, cplex.prod(input[i][j], w[i]));
         }
         value = cplex.diff(value, result[i]);
         value = cplex.square(value);

         objective = cplex.sum(objective, value);
      }



cplex.minimize(objective);
//constraints
IloLinearNumExpr weightsAdded = cplex.linearNumExpr();
for (int j = 0; j < w.length; j++) {
    weightsAdded.addTerm(1, w[j]);
}
cplex.addEq(weightsAdded, 1);       

for (int i = 0; i < w.length; i++) {
    cplex.addGe(0, w[i]);
}

// solve model
if (cplex.solve()) {
    System.out.println("obj = "+cplex.getObjValue());
}
else {
    System.out.println("problem not solved");

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...