非線形最適化のパフォーマンスが、ソルバー エンジンのインターフェースの特定の方法によってどのように影響されるかを理解するのに、いくつかの困難があります。
最初のバージョンでは GAMS で書かれた最適化モデルがあります。IPOPT (一般的な FOOS 非線形ソルバー エンジン) は、最適化ごとに IPOPT (関数評価なし) で 1.4 CPU 秒、関数評価で 0.2 CPU 秒の実行時間を返していました。
モデルを C++ に変換し (モデルの最適化されていないコンポーネントをより適切に説明するため)、その C++ API を介して IPOPT をインターフェースした (AD 用の ADOL-C および ColPack を使用) と、IPOPT で 0.7 秒、9.4 秒の実行時間が得られました。数秒の関数評価 (IPOPT の改善は、ソースごとに IPOPT をコンパイルすることで、IPOPT の GAMS バージョンでは利用できないより優れた線形ソルバーを使用できたことが原因である可能性があります)。
そのため、C++ を使用すると、明らかに最適化が不十分なコードを使用すると、GAMS よりも 50 倍遅い結果が得られましたが、ソルバー時間の短縮によって部分的に補償されました。
現在、モデルを他の言語 (Pyomo を使用した Python、または JuMP を使用した Julia) に変換する可能性を評価しています。
しかし、最初に、各ステップでソルバーによって行われる関数評価が、実装されている特定の言語にどのように依存するかを理解したいと思います。
C++ では、最適化モデルを作成する関数が反復ごとに直接実行 (評価) されることは明らかであるため、それらの実装方法が重要です (特に、少なくとも私たちの実装では、勾配とヘシアンは毎回再計算されます)。 .
PyomoとJuMPはどうですか?Python と Julia で評価される各反復か、それとも Pyomo と JuMP が代わりに (私が推測する) C で最初にモデルをレンダリングし、勾配とヘッセ行列を一度だけ計算 (評価しない) し、それからこの「C バージョン」です。毎回評価されますか?特にpythonの場合、明らかに大きな違いがあります..