2017-11-26 8 views
1

私は制約と上限/下限で非lenear最適化問題があるので、scipyではSLSQPを使用する必要があります。問題は明らかに凸ではありません。 私は、目的関数と制約関数の両方が正常に動作するようにjacobian foを得ました(結果は300入力ベクトルまでは良い/高速です)。すべての機能はベクトル化され、非常に高速に動作するように調整されています。問題は、1000+入力ベクトルの使用には年齢がかかることですが、ミニマイザが私の関数を多く呼び出すのではなく(客観的/制約/勾配)、処理時間の大半を内部的に費やしているようです。私はSLSQPのどこかのパーセンテージをO(n^3)と読んでいます。scipy.optimize.minimize( 'SLSQP')2000 dim変数を与えたときに処理が遅すぎる

Pythonのこのタイプの問題に対して、より優れた/高速のSLSQP実装や別の方法がありますか?私はnloptを試して、何とか私がscipyで使っているのと全く同じ関数(メソッドのシグネチャに適応するためのラッパーを使って)を指定すると、間違った結果を返す。私もpyoptoptパッケージでipoptを使用するのに失敗しました、pythonラッパーで動作するipoptバイナリを得ることができません。

UPDATE:私の入力変数は、基本的に(x、y)タプルのベクトル、または座標を表す2Dサーフェスの点です。 1000ポイントで、私は2000年の暗い入力ベクトルで終わる。私が最適化したい機能は、それらの関係と他の制約を考慮して、お互いの間のポイントの最適な位置を計算します。だから問題は疎ではありません。

おかげで...

+0

Sandiaにはdakota(https://dakota.sandia.gov/)の最適化ソルバーがあります。 DakotaはPythonとインターフェースできます。つまり、パラメータをPythonからDakotaに渡して結果を返すことができます。ここにダコタについての要約に[link](https://dakota.sandia.gov/content/about)があります。 – dustin

+0

また、SLSQPがBFGSを内部的に使用していることも確信しています。これは、20000 * 20000を使用するN * Nのサイズの行列を使用して、各繰り返しで重い計算(少なくとも行列ベクトル)を行うことを意味します。 – sascha

答えて

1

我々は、モデルについて多くを知らないが、ここではいくつかの注意事項は次のとおりです。

  1. SLSQPは本当に小さな(密)、よくスケールモデル用に設計されています。
  2. SLSQPはローカルソルバーです。非凸面問題を受け入れますが、地元の解決策のみを提供します。
  3. SLSQPのこの種の複雑さには疑問があります。とにかく、それは特定の問題のパフォーマンスについてはあまり言いません。
  4. IPOPTは、大規模で疎な内部ポイントソルバーです。それは地元の解決策を見つけるでしょう。それは本当に大きなモデルを解決することができます。
  5. BARON、ANTIGONE、COUENNEなどのグローバルソルバは、グローバルなソリューション(または、早すぎると早期に停止する場合は、ソリューションの品質に関する境界)を検出します。これらのソルバは、ローカルソルバよりも(ほとんどの場合)遅いです。私は直接のPythonリンクを認識していません。
  6. 出発点がある場合は、ローカルソルバーが必要なだけかもしれません。マルチスタート戦略を使用すると、より良いソリューションを見つけることができます(グローバルには最適ではありませんが、実際には最適ではないという確信が得られます)。
  7. PythonフレームワークPYOMOでは、多くのソルバーにアクセスできます。ただし、モデルを書き直す必要があります。 PYOMOには自動的な差別化があります。グラデーションを用意する必要はありません。
  8. テストのために、モデルをAMPLまたはGAMSで転写し、NEOSでオンラインで解決することができます。これにより、多くのソルバーを試すことができます。 AMPLとGAMSの両方に自動判別があります。私は不等式制約を含めるようにコスト関数を変更した後
+0

ありがとう。率直に言って、コスト/制約関数とjacodiansを微調整するための出発点としてSLSQPを使用しました。しかし、それは拡大縮小しません。私の意図する用途は20k +入力変数で、既に最適化されたソリューションに小さな摂動を導入するときにはリアルタイム最適化が必要です(最初の実行には時間がかかりますが、大丈夫です。 –

+0

多くのソルバー(特にアクティブセットメソッド)は、事柄を実現可能なものにすることができれば、非常に優雅にこれを行うべきです。プロセス産業では、これらのタイプのオンラインアルゴリズムは珍しいことではありません。 –

0

は驚くべきことに、私は(実際にRMSProp、勢いで勾配降下)基本的な勾配降下を使用して、Tensorflow、深い学習フレームワークのためのオプティマイザを使用して、比較的OK解決策を見つけましたペナルティとしてのバウンディングの制約(これはラグランジュ法と同じと仮定します)。これは超高速でトレーニングを行い、制約ペナルティ上の適切なラムダパラメータですばやく収束します。私はジャコビア人を書き直す必要さえしなかった。明らかにTFにはそれほどスピードの影響がない。

これまではNLOPTを動作させることができましたが、scipy/SLSQPよりもはるかに高速ですが、高次元ではまだ遅いです。また、NLOPT/AUGLANGは超高速ですが、収束しません。

これは、20k変数で、それはまだ低速です。部分的にはメモリスワッピングに起因し、コスト関数は対のユークリッド距離から少なくともO(n^2)である(私はブロードキャストで(x-x.t)^ 2 +(y-y.t)^ 2を使用する)。まだ最適ではありません。

関連する問題