私が見つけた唯一のGoogle検索結果はQuadProg ++ですが、行列がコレスキー分解に適用できない二次計画問題を解くことはできません。
他のライブラリについて誰か提案してもらえますか?ありがとう。
// by default, we have a nonnegative QP with Ax <= b
Program qp (CGAL::SMALLER, true, 0, false, 0);
// now set the non-default entries:
const int X = 0;
const int Y = 1;
qp.set_a(X, 0, 1); qp.set_a(Y, 0, 1); qp.set_b(0, 7); // x + y <= 7
qp.set_a(X, 1, -1); qp.set_a(Y, 1, 2); qp.set_b(1, 4); // -x + 2y <= 4
qp.set_u(Y, true, 4); // y <= 4
qp.set_d(X, X, 2); qp.set_d (Y, Y, 8); // !!specify 2D!! x^2 + 4 y^2
qp.set_c(Y, -32); // -32y
qp.set_c0(64); // +64
// solve the program, using ET as the exact type
Solution s = CGAL::solve_quadratic_program(qp, ET());
assert (s.solves_quadratic_program(qp));
最初の例のコード。
LAPACKには、いくつかのコレスキー分解ルーチンがあります(コレスキー分解と呼ばれます)。LAPACKで使用できるC++ラッパーがあります(リストについては、このSOの質問を参照してください)。
その投稿のAnycomからの回答は少しわかりにくいですが、Boostの線形代数ライブラリuBLASと一緒に使用できるLAPACKバインディングがあることを意味しました。
私はこのライブラリを見つけました:OOQP(二次計画法のためのオブジェクト指向ソフトウェア)。そのページを下にスクロールすると、研究論文とユーザーガイドが表示されます。そのライブラリにはC++APIがあるようです。お役に立てれば。
上記の答えの多くが欠けている微妙な点は、行列が正の半正定値 (PSD) だけなのか、実際には不定なのかということです。私は quadprog を使用していませんが、PSD 目的行列で失敗した場合、それはソフトウェアの堅牢性の欠如の兆候です (凸 QP は多くの場合 PSD であり、厳密に凸QP のみが正定値です)。Golub の著書 "Matrix Computations" によると、Cholesky 分解は PSD 行列に適用できますが、数値の安定性が損なわれる傾向があります。
一般的な非線形プログラミング ソフトウェア (凸型と非凸型の両方) について、COIN-OR プロジェクトはフリー ソフトウェアと非フリー ソフトウェアのリストを維持しています。リストされているソルバーの 1 つに IPOPT があり、これは確かに問題を解決することができます。IPOPT は内点法アルゴリズムを使用します。これは、小さな問題の場合、一般にアクティブ セット法 (quadprog が使用するものなど) よりも遅くなります。別の方法として、QP を線形相補性問題 (LCP) として定式化し、LCP ソルバーを使用して解くことができます。私は、Fackler と Miranda の Matlab コード LEMKE が C++ に簡単に移植できることを発見しました。
支払う意思がある場合は、Mosekを使用できます。ただし、30日間の無料トライアルがあります。これは一般的に利用可能な最速のソルバーと考えられています (引用なし、申し訳ありません) インターフェイスは C スタイルですが、C++ から完全に呼び出すことができます。Mosek は実際には円錐計画法のソルバーですが、問題を円錐問題として再定式化する気がない場合 (Mosek には、これを行う方法に関する多くのドキュメントがあります)、確率的勾配降下法ソルバーを使用して解くことができます。あなたの二次方程式。