2013-08-02 3 views
3

Недавно я столкнулся с проблемой квадратичного программирования (QCQP) с квадратичным ограничением в моих исследованиях. Я нашел что-то полезное в инструменте оптимизации MATLAB, то есть функцию fmincon (общая нелинейная оптимизация с нелинейными ограничениями), она использует «алгоритм внутренней точки» для решения моей проблемы, которая содержит 8 переменных, 1 квадратичное ограничение равенства и 1 квадратичное ограничение неравенства , «fmincon» с или без «Гессиан» и «Градиент» обеспечивают неплохое решение, единственное, чего я не удовлетворен, - это эффективность, так как мне нужно назвать это как миллион раз в моем основном коде. Мне нужно найти что-то, что может быть более специфичным для QCQP, возможно, эффективность может быть улучшена. Однако я нашел много информации из netlib и wiki, но у меня нет суждения о том, какой из них я должен использовать, и было бы утомительно пытаться делать вещи один за другим, мне действительно нужны некоторые предложения. Кстати, я в основном программирую в MATLAB для этой проблемы, но подходящий c/fortran также полезен.Квадратично ограниченное квадратичное программирование (QCQP) в MATLAB

-yan

+0

Если проблема квадратная, используйте «quadprog». Кроме того, вам нужно будет предоставить дополнительную информацию о спасительной проблеме, чтобы остальные люди могли говорить о возможно более быстрых алгоритмах. –

+0

«quadprog» MATLAB - это решатель квадратичного программирования, однако он принимает только линейные равенства и ограничения и границы без равенства. Мой вопрос касается нелинейных ограничений, которые не могут быть обработаны им. MATLAB 'fmincon' очень хорош для моей проблемы, но я ищу что-то более эффективное, так как мне нужно назвать миллионы времени этой функцией. – ywang

ответ

3

Альтернативой является использование CVx, available here, который работает хорошо для QCQPs (среди многих других типов задач). Вот фрагмент кода, который решает QCQP:

close all; clear; clc 
n = 10; 
H = rand(n); H = H*H'; % make spsd 
f = -rand(n,1); 
Q = rand(n); Q = Q*Q'; % make spsd 
g = -rand(n,1); 
cvx_begin 
    variable x(n) 
    0.5*x'*Q*x+g'*x <=0 
    x >= 0 
    minimize(0.5*x'*H*x + f'*x) 
cvx_end