Bạn nói trong bình luận rằng bạn không thể làm cho nó hoạt động vì nó không đủ bậc hai. Tôi không thấy bất kỳ lý do cho điều đó. Vấn đề dễ dàng được mã hóa thành một chương trình bậc hai hỗn hợp.
Nếu tôi hiểu định nghĩa vấn đề của bạn, bạn muốn ràng buộc tổng các biến có giá trị lớn hơn ngưỡng. Giới thiệu một biến nhị phân cho biết nếu x lớn hơn a và giới thiệu một biến z khác phải bằng x khi giá trị này giữ và bằng không, và sử dụng tổng của các biến mới.
Sử dụng hộp công cụ MATLAB YALMIP để giao diện CPLEX (hoặc Gurobi hoặc bất kỳ bộ giải MIQP nào khác), vấn đề được giải quyết một cách tầm thường trong các phân số của một giây. Ở đây, một ví dụ ngẫu nhiên, được triển khai bằng cả mô hình có nguồn gốc thủ công và mô hình khai thác các khả năng mô hình hóa cấp cao trong 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)]