私はジュリア内でIPOPTを使用しています。私の目的関数は、特定のパラメータ値に対してエラーを投げます(具体的には、これは問題ではないと考えていますが、共分散行列のコレスキー分解が必要なので、共分散行列は正定でなければなりません)。そのため、私はパラメータを非線形に制約し、エラーを生成することはできません。この制約にもかかわらず、IPOPTはパラメータの目的関数を評価して、目的関数がエラーを投げ出すように依頼しています。これは私のスクリプトをクラッシュさせ、悲惨さと苦痛をもたらします。制約違反にもかかわらず、IPOPTが目的関数を評価するのはなぜですか?
なぜ、一般に、IPOPTが制約に違反するパラメータで関数を評価するのか興味があります。 (私は関数を評価する前に実際に制約をチェックしていることを確認しています。)可能であれば、どうやってこれを止めることができますか?
IPOPTの 'bound_relax_factor'パラメータをゼロに設定しました。これは役に立たない。私は目的関数がエラーを投げるのではなくNaN
を返すように求めることができると理解していますが、私がIPOPTを行うと、さらに混乱して収束しなくなります。悪いこと。
役立つ場合は、サンプルコードをご記入ください。事前に
多くの感謝:) :)
EDIT:
コメンターは、私が制約に違反したときに不正な目標値を返すために、私の目的関数を尋ねる示唆しました。残念ながら、これは私が行うときに何が起こるかです:Ipoptは10^10で評価のポイントに2.0016x10^2の評価ポイントから行くと、なぜ私はよく分からない
- 私はIPOPTについてかなり根本的な何かがあります心配しますわかりません。
'constr_viol_tol'と 'acceptable_constr_viol_tol'を最小値に設定しても、最適化にはあまり影響しません。また、パラメータを過大に制限することもできません(許容できない値に近づけないようにする)。
おそらく(NaN)の代わりに(パッチの解決策として)、違反が増えるにつれて悪化するように、制約が違反されたときにむしろ悪い客観的価値を返すでしょう。 –
また、IPOPTパラメータの 'constr_viol_tol'と' acceptable_constr_viol_tol'は関連性があります。 –
あなたのコメントのおかげで@DanGetz - 私は元の質問に編集で応答しました:) – Wilbur