Y a-t-il une bibliothèque de programmation quadratique en C ++?
Le seul résultat de recherche Google, j'ai trouvé est QuadProg++, mais il ne peut pas résoudre le problème de programmation quadratique dont la matrice n'est pas applicable pour la décomposition de Cholesky.
Si quelqu'un peut me donner quelques suggestions sur d'autres de la bibliothèque? Merci.
source d'informationauteur Daniel Gao
Vous devez vous connecter pour publier un commentaire.
Il y a plusieurs bibliothèques qui incluent QP solveurs. Il y a à la fois open-source et les options commerciales. Les questions /réponses de la liste de quelques-uns de ces. Je tiens à clarifier la question avec la matrice.
Je suppose que vous faites référence à l'objectif de la matrice. La contrainte de la matrice ne doit conduire à un non-vide possible ensemble. Vous avez mentionné que la matrice n'est pas adapté pour la décomposition de Cholesky. Depuis la décomposition de Cholesky peut être formé pour toute matrice définie positive, l'implication est que votre matrice est définie positive.
Si la matrice est semi-définie positive (c'est à dire qu'il a un ou plusieurs zéro les valeurs propres) alors le problème est convexe QP et peuvent être résolus de manière efficace. Cependant, de nombreux problèmes nécessitent positif de l'objectif défini. Étant donné que l'objectif d'un semi-définie positive QP est un non-trivial nullspace, il peut y avoir beaucoup de solutions. En fait, l'ensemble des solutions peut-être même sans bornes. Algorithmes numériques ne fera que donner une solution approximative de toute façon, de sorte qu'il est rarement important que la matrice de valeurs propres qui sont exactement zéro. Vous pouvez faire de la matrice définie positive par l'ajout d'une matrice diagonale avec une petite valeur positive sur la diagonale. Ce sera l'essentiel de sélectionner la solution avec le plus petit 2-norme. Dans la pratique, c'est une bonne idée de faire ce même lorsque la matrice est définie positive, car les matrices qui ont des valeurs propres proches de zéro peuvent souvent causer des problèmes avec les solveurs numériques. Combien diagonale à ajouter dans est un compromis entre la stabilité et de la précision.
Si la matrice est à durée indéterminée (c'est même une valeur propre négative), alors le problème est NP-dur. Cela signifie que tous les codes basés sur les algorithmes disponibles auront déraisonnable des cas les pires temps d'exécution, même modérée de la taille des problèmes. Si votre problème a une certaine structure spéciale ou vous n'avez pas besoin d'une solution globalement optimale, alors vous pourriez être ok. Une approche classique consiste à regarder pour une relaxation convexe.
LAPACK a un certain nombre de décomposition de Cholesky de routines (ils appellent cela la factorisation de Cholesky). Il existe en C++ wrappers disponibles pour LAPACK (voir cette SI question pour une liste).
La réponse de Anycom dans ce post est un peu énigmatique, mais il veut dire qu'il y a LAPACK les liaisons qui peuvent être utilisés ensemble avec Boost de l'algèbre linéaire bibliothèque, uBLAS.
J'ai trouvé cette bibliothèque: OOQP (Object-Oriented Software de Programmation Quadratique). Si vous faites défiler vers le bas de cette page, vous trouverez un document de recherche et un guide de l'utilisateur. Il semble y avoir une API C++ pour la bibliothèque. Espérons que cette aide.
CGAL ressemble beaucoup pour la programmation quadratique. Il en est de même un manuel.
Code de le premier exemple.
La subtilité que de nombreuses réponses ci-dessus sont manquantes est de savoir si la matrice est seulement semi-définie positive (PSD) ou est réellement indéfinie. Je n'ai pas utilisé quadprog, mais si elle échoue sur un PSD objectif de la matrice, qui est le signe d'un logiciel de manque de robustesse (convexe QPs sont souvent PSD, où seulement strictement convexe QPs sont définie positive). Selon Golub du livre "Matrice de Calculs", factorisation de Cholesky peut être appliqué pour le PSD, les matrices, mais la stabilité numérique a tendance à souffrir.
Général de programmation non linéaire logiciel à la fois convexe et non convexe, la PIÈCE de monnaie OU d'un projet maintient des listes de gratuit et logiciel non-libre. L'un des solveurs ils liste est IPOPT, qui est certainement capable de résoudre votre problème. IPOPT utilise un algorithme de points intérieurs, qui, pour des petits problèmes, est généralement plus lente que l'ensemble des méthodes (comme quadprog utilise). Comme alternative, vous pouvez formuler votre QP comme un processus linéaire de la complémentarité problème (LCP) et puis le résoudre à l'aide d'un LCP solveur. J'ai trouvé Fackler et Miranda code Matlab LEMKE être facilement portable pour C++.
Si vous êtes prêt à payer, vous pouvez utiliser Mosek. Il y a un essai gratuit de 30 jours, si. Il est généralement considéré comme le plus rapide du solveur disponible (pas de citation, désolé), L'interface est de type C, même si évidemment perfectally callalbe à partir de C++. Mosek est vraiment plus d'une conique solveur de programmation, mais si vous n'avez pas envie de reformuler votre problème comme une conique problème (Mosek a beaucoup de documentation sur la façon de le faire), vous pouvez toujours utiliser ses la descente de gradient stochastique solveur pour résoudre votre formulation quadratique.