3

私はいくつかの二次計画問題を解決するためにCGALを使用しています。

(-無限大)から 。までの値x^2を取るために最小化したいと仮定します。これは、次のようにすることで簡単に解決できます。x-oo+oo

      Program qp (CGAL::SMALLER, false, 0, false, 0);
      qp.set_d(0, 0, 2);

      Solution s = CGAL::solve_quadratic_program(qp, ET());

もちろん0、結果として返されます。ここで、を最大化したいとし x^2ます。そのためには、を最小化する必要があり-x^2ます。しかし、以下はCGALでは「機能」しません。

      Program qp (CGAL::SMALLER, false, 0, false, 0);
      qp.set_d(0, 0, -2);

      Solution s = CGAL::solve_quadratic_program(qp, ET());

現在の行列D = [-2]は正半定値ではないため(二次計画問題のAPIは、Dが正半定値であることを「要求」します)。上記のスニペットを実行すると、の0代わりに間違った結果が返され-ooます。

x^2CGALのように目的関数を最大化するにはどうすればよいですか?

4

1 に答える 1

4

CGALのドキュメントによると、目的関数は凸関数の最小化でなければなりません。凸状ではない-x^2を最小化しようとしているため、CGALではこれを行うことができません。

さらに、リンクしたドキュメントのセクション10.2.2には、非凸関数を最小化しようとしても、問題が非凸であるという警告が表示されない場合があり、代わりに最適な解決策が見つかったというメッセージが返されると書かれています。つまり、QPにCGALを使用する場合は、それが凸2次式であることを確認してください。そうしないと、悪い答えが得られます。

非凸非線形最適化を処理できるソルバーを検討するかもしれません。IPOPTはオープンソースであり、目的関数と制約が2回連続的に微分可能である場合に機能します。COIN-ORには、あなたに役立つかもしれないいくつかのソルバー(「最適化決定論的非線形」を参照)があります。KNITROは優れた商用ソルバーです。

于 2012-12-04T07:09:40.930 に答える