問題タブ [ipopt]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Linuxでpyomoでipoptオプティマイザを使用する方法
私はipoptコインまたはウェブサイトの指示に従い、ipoptオプティマイザをインストールすることができました. これにより、ビルド ディレクトリにいくつかの静的オブジェクト ファイルが生成されましたが、bin フォルダーは生成されませんでした。
さて、pyomo に ipopt を使用させようとするとき、私が見た唯一の方法は実行可能な場所を指定することですが、それ
opt = SolverFactory('ipopt', executable='executable path here')
が何であるかはわかりません。
また、coin-or の Web サイトにコンパイル済みのバイナリがいくつかあることにも気付きました。それらには bin フォルダー内に ipopt 実行可能ファイルが含まれていますが、リンクすると、システムは という名前の静的オブジェクトの欠落について不平を言うようになりますlibsvml.so
。
ipopt インストール ガイドには libsvm についての言及がないため、これが私を本当に混乱させます。
おそらくメイク/インストールのステップで何かを見逃しましたか? どんな助けでも大歓迎です
python - pyipopt 使用時の openmpi のエラー
ソースからipoptをインストールし、すべての手順に従い、テストも成功しました。しかし、 https: //github.com/xuy/pyipopt から pyipopt をインストールしてテスト例を実行すると、次のエラーが表示されます。
ここで同様のエラーが見つかり、それを使用--disable-dlopen
して機能させていますが、ipopt コンパイル プロセスでこのタグを追加するにはどうすればよいですか?
c# - C# で IPOPT を使用した再現性のない結果
現在、 IPOPTとcsipoptを使用して C# で最適化の問題を実装しようとしています。
同じプロセスで同じデータを使用して同じ問題を何度も実行すると、毎回異なる結果になることがわかりました。とりわけ、CPU 時間はログ ファイルで増加し続け、最初の IPOPT 見出しは最初のログ ファイルにのみ出力されます。ただし、プロセスを停止して再起動すると、結果が再現可能になります (つまり、反復 0 は毎回同じで、反復 1 も同じなど)。
最初の反復ログ:
2 回目の反復ログ:
私の推測では、問題を解決するときに一部のリソースが解放されず、一部の値がメモリのどこかに保持されていると思われます。私の問題が収束することもあれば、同じデータで収束しないこともあるため、これはさらに問題になります。
私の問題は次のように構成されています。
次に、(コンソール アプリから) 次のように呼び出します。
余談ですが (関連している可能性がありますか?)、同じ問題が単体テストとコンソール アプリで収束しますが、Windows サービスや WebAPI では収束しません。
完全な実行可能なコードはリポジトリ(VS2017) で入手でき、再現できない結果を示しています。
ヒントやガイダンスをいただければ幸いです。私は決して最適化問題の専門家ではなく、IPOPT の専門家ではありません。
編集Dispose
IPOPT インターフェイス
のメソッドは次のとおりです。
これは問題自体を解放するように見えますが、ソルバーは解放しません。
eigen - Eigen および IPOPT によるベクトル化フラグ
IPOPT で最適化する C++ 関数がいくつかあります。コスト関数、制約関数などは C++ で記述されていますが、コードはもともと C インターフェイスを使用するように記述されています。それが問題であることが判明しない限り、私はまだそれを変更することを気にしていません.
とにかく...ベクトル化フラグを使用して/使用せずにプログラムをコンパイルすると、オプティマイザーが異なる方法で収束するという予期しない動作が観察されています。具体的には、CMakeLists ファイルには、
これらの設定でオプティマイザーを実行すると、オプティマイザーは約 100 回の反復で収束します。ここまでは順調ですね。
ただし、ARM (特に Android) 用にコンパイルした場合、パフォーマンスが Intel プロセッサとは大幅に異なるため、ベクトル化は発生しないと考える理由があります。Eigen のドキュメントには、64 ビット ARM では NEON 命令を常に有効にする必要があると記載されていますが、それが行われていないのではないかと疑う理由があります。とにかく、それはここでの問題ではありません。
この疑いがあるため、ベクトル化を無効にした場合に Intel プロセッサのパフォーマンスがどの程度低下するかを確認したいと考えました。これにより、ベクトル化がどの程度行われているか、また ARM でどの程度の改善が期待できるかがわかります。ただし、コンパイラフラグを次のように変更すると、
(または、単に AVX (fma なし) を使用する場合)、オプティマイザーから同じ一般的なソリューションが得られますが、収束パフォーマンスは大きく異なります。具体的には、ベクトル化を行わない場合、オプティマイザーは解に収束するまでに約 500 回の反復を行います。
要約すると:
ソースコードではなく、文字通りcmakeファイルの1行だけを変更しています。
なぜこれが発生するのかについて、いくつかの提案をお願いします。
私の考えとその他の背景情報:
ベクトル化を使用するバージョンと使用しないバージョンのどちらでも何らかの丸め処理を行う必要があり、それによって IPOPT の収束が異なるように思われます。AVX フラグと FMA フラグを追加しても、関数の出力は変わらず、計算にかかる時間だけが変わるという印象を受けました。私は間違っているようです。
私たちが観察している現象は、オプティマイザーが常に同じ解に収束することを観察しているため、私には特に奇妙に思えます。これはどういうわけか、問題があまりにも悪条件であってはならないことを示唆しています。しかし一方で、ベクトル化フラグの有無でオプティマイザーの動作が異なるという事実は、ベクトル化された命令によって生成される小さな残差が何であれ、問題が実際に敏感であることを示唆しています。
心に留めておくべきもう 1 つのことは、IPOPT をライブラリにプリコンパイルし、そのプリコンパイル済みライブラリに対してコードを単にリンクしていることです。したがって、AVX フラグと FMA フラグがオプティマイザー自体に影響を与える可能性はないと思います。これは、ベクトル化が有効かどうかに応じて、関数が明確に異なる値を出力する必要があることを意味しているようです。
興味のある方は、ここに完全な cmake ファイルがあります