2013-05-26 11 views
2

Я запускаю CPLEX (версия 125) на MATLAB с использованием API CPLEX. Я пытаюсь решить проблему с ограниченным квадратичным программированием, и я сталкиваюсь с первичной неосуществимостью. В частности, код MATLAB для задачи является:CPLEX primal infeasibility

[ystar, Jstar, flag, output]= ... 
      cplexqp(H, f, F, phi, G, gamma, ymin, ymax); 

, который соответствует задаче:

ystar = argmin_y y'*H*y + f'*y 
    subject to: 
    ymin <= y <= ymax 
    G * y = gamma 
    F * y <= phi 

Однако решение ystar возвращаемого cplexqcp таково, что:

max(F*ystar-phi) = 5.1854e-05 

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

ops=cplexoptimset('cplex'); 
ops.feasopt.tolerance=1e-7; 

Как я могу настроить решатель таким образом, чтобы выровнять нецелесообразность? Решатель дает следующие диагностические сообщения:

Number of nonzeros in lower triangle of Q = 2622 
Using Approximate Minimum Degree ordering 
Summary statistics for factor of Q: 
    Rows in Factor   = 4248 
    Integer space required = 4362 
    Total non-zeros in factor = 27048 
    Total FP ops to factor = 334848 
Tried aggregator 1 time. 
QP Presolve eliminated 1128 rows and 114 columns. 
Aggregator did 80 substitutions. 
Reduced QP has 7984 rows, 8302 columns, and 129418 nonzeros. 
Reduced QP objective Q matrix has 4134 nonzeros. 
Parallel mode: using up to 8 threads for barrier. 
Number of nonzeros in lower triangle of A*A' = 433356 
Using Approximate Minimum Degree ordering 
Summary statistics for Cholesky factor: 
    Threads     = 8 
    Rows in Factor   = 7984 
    Integer space required = 32473 
    Total non-zeros in factor = 556316 
    Total FP ops to factor = 62101602 
Itn  Primal Obj  Dual Obj Prim Inf Upper Inf Dual Inf   
    0 1.6154270e+04 -1.8807064e+06 1.92e+06 2.77e+05 5.03e+06 
    1 1.7649880e+06 -4.6190853e+06 5.23e+05 7.57e+04 1.37e+06 
    2 1.8883665e+06 -4.8518299e+06 1.30e+05 1.89e+04 3.42e+05 
    3 8.3385088e+05 -2.9607988e+06 2.05e+04 2.97e+03 5.39e+04 
    ... (some lines are omitted for brevity) 
    31 9.9411620e+01 9.9411598e+01 1.10e-08 9.27e-10 4.32e-08 
    32 9.9411615e+01 9.9411611e+01 1.37e-08 1.47e-10 6.85e-09 
    33 9.9411614e+01 9.9411614e+01 2.19e-08 6.10e-12 2.51e-08 
Barrier time = 1.91 sec. (361.06 ticks)  
Total time on 8 threads = 1.91 sec. (361.06 ticks) 

Так что, кажется, что изначальная невыполнимость решения является 2.19e-08; однако, похоже, что решение не так реально.

Обновление: Я нормализовал равенства и неравенства ограничений следующим образом:

F = F ./ kron(ones(1,size(F,2)), abs(phi)); 
phi = sign(phi); 

. (Примечание: ни один элемент phi не равен нулю или около нуля Таким образом, все элементы phi стать либо 1 или -1.) и

for i=1:numel(gamma) 
    if (abs(gamma(i))>1e-4) 
    G(i,:) = G(i,:)/abs(gamma(i)); 
    gamma(i) = sign(gamma(i)); 
    end 
end  

неосуществимость Я получаю сейчас находится 5.577e-07 рассчитывается как max(F*ystar-phi) (для обновленные нормированные матрицы F и phi). Используется ли CPLEX с помощью встроенного решения? Если да, то не должно быть никакой неосуществимости.

Обновление 2: Я загрузил данные для этой проблемы и тестовый пример HERE.

ответ

2

Параметр methodopt.tolerance применяется к методуОТО, который представляет собой отдельный алгоритм, предназначенный для отладки моделей и не повлияет на оптимизатор. Вам нужен параметр EpRhs, который определяет, сколько ограничений может быть нарушено в оптимальном решении. Вы можете использовать cplexoptimset ('EpRhs', 1e-6 ') для установки параметра.

+0

Любая идея о том, как изменить это в MATLAB? –

+0

Я пробовал, но это не сработало ... 'cplexoptimset' не поддерживает эту опцию (я также пробовал с строчными символами). –

+0

@PantelisSopasakis try ops.simplex.tolerances.feasibility = 1e-7 –