あなたはコメントでそれが十分に二次式ではないのでそれを機能させることができないと言います。その理由はわかりません。問題は、混合整数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)]