2016-04-28 1 views
3

私はジュリア内でIPOPTを使用しています。私の目的関数は、特定のパラメータ値に対してエラーを投げます(具体的には、これは問題ではないと考えていますが、共分散行列のコレスキー分解が必要なので、共分散行列は正定でなければなりません)。そのため、私はパラメータを非線形に制約し、エラーを生成することはできません。この制約にもかかわらず、IPOPTはパラメータの目的関数を評価して、目的関数がエラーを投げ出すように依頼しています。これは私のスクリプトをクラッシュさせ、悲惨さと苦痛をもたらします。制約違反にもかかわらず、IPOPTが目的関数を評価するのはなぜですか?

なぜ、一般に、IPOPTが制約に違反するパラメータで関数を評価するのか興味があります。 (私は関数を評価する前に実際に制約をチェックしていることを確認しています。)可能であれば、どうやってこれを止めることができますか?

IPOPTの 'bound_relax_factor'パラメータをゼロに設定しました。これは役に立たない。私は目的関数がエラーを投げるのではなくNaNを返すように求めることができると理解していますが、私がIPOPTを行うと、さらに混乱して収束しなくなります。悪いこと。

役立つ場合は、サンプルコードをご記入ください。事前に

多くの感謝:) :)

EDIT:

コメンターは、私が制約に違反したときに不正な目標値を返すために、私の目的関数を尋ねる示唆しました。残念ながら、これは私が行うときに何が起こるかです:Ipoptは10^10で評価のポイントに2.0016x10^2の評価ポイントから行くと、なぜ私はよく分からない Ipopt running indefinitely at bad objective value

- 私はIPOPTについてかなり根本的な何かがあります心配しますわかりません。

'constr_viol_tol'と 'acceptable_constr_viol_tol'を最小値に設定しても、最適化にはあまり影響しません。また、パラメータを過大に制限することもできません(許容できない値に近づけないようにする)。

+0

おそらく(NaN)の代わりに(パッチの解決策として)、違反が増えるにつれて悪化するように、制約が違反されたときにむしろ悪い客観的価値を返すでしょう。 –

+0

また、IPOPTパラメータの 'constr_viol_tol'と' acceptable_constr_viol_tol'は関連性があります。 –

+0

あなたのコメントのおかげで@DanGetz - 私は元の質問に編集で応答しました:) – Wilbur

答えて

3

Ipoptがすべての中間の反復で満たすことが保証される唯一の制約は、変数の単純な上限と下限です。ソルバが最終的な反復で収束するまで(終了条件を満たすポイントに到達できる場合)、他の線形または非線形の等価性または不等式の制約は必ずしも満たされません。任意の非凸型等価性と不等式制約の存在下で、中間反復が常に実行可能であることを保証することは扱いにくい。ニュートンのステップの方向は、局所的な1階微分情報と2階微分情報に基づいているため、近似値になり、問題に悪影響を与えない場合は実行可能なポイントのスペースを残す可能性があります。例えば、x * y == constantという点の空間を考えてみましょう。

無効なポイントで目的関数または制約関数を評価する必要がないように、問題を再定式化する必要があります。たとえば、データから構成された共分散行列のコレスキー分解を行う代わりに、単位下三角行列Lと対角行列Dを導入します。すべてi in 1:size(D,1)に下限制約D[i, i] >= 0を、非線形等価制約L * D * L' == Aを与えます。ここで、Aは共分散行列です。次に、をCholesky分解で操作する必要があるところで使用してください(これはおそらく半定量分解であるため、古典的厳密に正の確定L * L'の分解よりもCholesky表現が変更されています)。

問題が凸であれば、Ipoptのような汎用ノンリニアソルバーよりも円錐ソルバーがより効率的になるという特殊な定式化があることに注意してください。

関連する問題