非線形制約のある2次関数の最小化


8

二次関数の最小化問題解決のために試すには良い方法(および/またはソフトウェアパッケージ)であるもの、ST 0 X I1、およびいくつかの非線形(そして微分不可能)な制約があります。たとえば、i x i 1 x i > a < bf(x)=i=1N(xiyi)20xi1ixi1xi>a<b

私は考えています。FWIW、Matlabは明らかに「ギル他と同様のアクティブセットメソッド」を使用しており、パフォーマンスに多少のばらつきがあります。N100


更新:以下のアーノルドの回答のリンクが役立ちます。ただし、この特定の問題については、混合整数問題(インジケーターを新しい変数として定義)として書き直し、混合整数ソルバーを使用すると役立ちました(CPLEXを機能させることができませんでした。 " それのための)。
laxxy

回答:



5

あなたはコメントでそれが十分に二次式ではないのでそれを機能させることができないと言います。その理由はわかりません。問題は、混合整数2次プログラムとして簡単にコード化できます。

問題の定義が理解できたら、変数の合計をしきい値よりも大きく制限したいと思います。xがaより大きいかどうかを示すバイナリ変数を導入し、これが成り立つ場合はxと等しく、それ以外の場合はゼロでなければならない別の変数zを導入し、新しい変数の合計を使用します。

MATLABツールボックスYALMIPを使用してCPLEX(またはGurobiやその他のMIQPソルバー)をインターフェースすると、問題はほんの一瞬で簡単に解決されます。ここでは、手動で派生したモデルとYALMIPの高レベルのモデリング機能を利用するモデルの両方を使用して実装されたランダムな例

% Create random data
N = 100;
y = rand(N,1);
a = rand(N,1);
b = rand(1);

% Decision variables
x = sdpvar(N,1);
z = sdpvar(N,1);
d = binvar(N,1);

% Define objective
Objective = (x-y)'*(x-y)

% High-level model
Con1 = [0 <= x <= 1,0 <= z <=1];
Con2 = [implies(x-a>=0,d), implies(d,z==x), implies(1-d,z==0)]
Con3 = [sum(z) <= b];

% Solve problem
solvesdp([Con1,Con2,Con3],Objective)

% display solution
[double(x) a double(z)]

% Manually derived model
Con1 = [0 <= x <= 1,0 <= z <=1];
Con2 = [x-a <= d, -(1-d) <= x-z <= 1-d, z <= d];
Con3 = [sum(z) <= b];
Objective = (x-y)'*(x-y)
solvesdp([Con1,Con2,Con3],Objective)
[double(x) a double(z)]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.