Matlab CPLEX: добавить несколько ограничений SOCP в cplexmiqcp - PullRequest
0 голосов
/ 30 апреля 2018

Я написал свою проблему в MATLAB, используя CPLEX в качестве решателя. Из-за проблем, которые находятся вне моего контроля (это возможно), API класса CPLEX облажается при решении моей проблемы. Итак, основываясь на сообщениях, найденных в других местах в Интернете, я пытаюсь решить с помощью API панели инструментов.

Для решения моей проблемы мне нужно использовать cplexmiqcp, который имеет входные данные:

cplexmiqcp(H,f,Aineq,bineq,Aeq,beq,l,Q,r,sostype,sosind,soswt,varLB,varUB,vartype,x0,options);

У меня есть несколько ограничений SOCP, и с помощью API класса я могу определить каждое из них, используя структуру, такую ​​как:

for n=1:numQCs
    cplex.Model.qc(n).a=QC.a{n};
    cplex.Model.qc(n).Q=QC.Q{n,1};
    cplex.Model.qc(n).sense=QC.sense{n};
    cplex.Model.qc(n).rhs=QC.rhs{n};
    cplex.Model.qc(n).lhs=QC.lhs{n};
end

Но как мне определить множественные квадратичные ограничения для входов cplexmiqcp? Это l,Q,r. Когда я пытаюсь создать структуру, как раньше, я получаю сообщение «Ошибка: неверно l, Q, r.»

1 Ответ

0 голосов
/ 01 мая 2018

Документация для функции набора инструментов cplexmiqcp: здесь . Цитируя документацию, для l, Q и r имеем:

l: Вектор или матрица с двумя столбцами для линейной части квадратичных ограничений
Q: Симметричная двойная матрица или массив ячеек строки симметричных двойных матриц для квадратичных ограничений
r: вектор двойной или двойной строки для rhs ограничений квадратного неравенства

Итак, когда мы хотим создать одно квадратичное ограничение, мы можем дать вектор с двумя столбцами, симметричную двойную матрицу и двойное для l, Q и r, соответственно. Когда мы хотим создать несколько квадратичных ограничений, нам нужно предоставить матрицу , массив ячеек строки симметричных двойных матриц и вектор строки для l, Q и r соответственно .

Рассмотрим следующую простую модель:

Minimize
 obj: x1 + x2 + x3 + x4 + x5 + x6
Subject To
 c1: x1 + x2 + x5  = 8
 c2: x3 + x5 + x6  = 10
 q1: [ - x1 ^2 + x2 ^2 + x3 ^2 ] <= 0
 q2: [ - x4 ^2 + x5 ^2 ] <= 0
Bounds
      x2 Free
      x3 Free
      x5 Free
End

Код MATLAB будет выглядеть следующим образом:

   H = [];
   f = [1 1 1 1 1 1]';                                                          

   Aineq = []                                                                   
   bineq = []                                                                   

   Aeq = [1 1 0 0 1 0;                                                          
          0 0 1 0 1 1];                                                         
   beq = [8 10]';

   l = [0 0;
        0 0;
        0 0;
        0 0;
        0 0;
        0 0;];
   Q = {[-1 0 0 0 0 0;
         0 1 0 0 0 0;
         0 0 1 0 0 0;
         0 0 0 0 0 0;
         0 0 0 0 0 0;
         0 0 0 0 0 0], ...
        [0 0 0 0 0 0;
         0 0 0 0 0 0;
         0 0 0 0 0 0;
         0 0 0 -1 0 0;
         0 0 0 0 1 0;
         0 0 0 0 0 0]};
   r = [0 0];

   sostype = [];
   sosind = [];
   soswt = [];

   lb    = [ 0; -inf; -inf; 0; -inf; 0];
   ub    = []; % implies all inf
   ctype = []; % implies all continuous

   options = cplexoptimset;
   options.Display = 'on';
   options.ExportModel = 'test.lp';

   [x, fval, exitflag, output] = cplexmiqcp (H, f, Aineq, bineq, Aeq, beq,...
      l, Q, r, sostype, sosind, soswt, lb, ub, ctype, [], options);

   fprintf ('\nSolution status = %s \n', output.cplexstatusstring);
   fprintf ('Solution value = %f \n', fval);
   disp ('Values =');
   disp (x');
...