Tối thiểu hóa một hàm bậc hai với các ràng buộc phi tuyến


8

những gì sẽ là phương pháp tốt (và / hoặc các gói phần mềm) để thử để giải quyết một vấn đề giảm thiểu một hàm bậc hai , st 0 x i1 , và có nhiều hạn chế một số trong đó được phi tuyến tính (và không khả vi), ví dụ: Σ i x i 1 x i > một < b ?f(x)= =ΣTôi= =1N(xTôi-yTôi)20xTôi1ΣTôixTôi1xTôi>một<b

Tôi đang nghĩ về . FWIW, Matlab rõ ràng đang sử dụng một "phương pháp thiết lập hoạt động, tương tự như phương pháp của Gill và cộng sự", có hiệu suất không đồng đều.N100


Cập nhật: liên kết trong câu trả lời của Arnold dưới đây rất hữu ích. Tuy nhiên, đối với vấn đề cụ thể này, thật hữu ích khi viết lại nó dưới dạng một vấn đề số nguyên hỗn hợp (xác định các chỉ số là biến mới) và sử dụng một bộ giải số nguyên hỗn hợp (mặc dù tôi không thể có CPLEX để hoạt động, vì ràng buộc rõ ràng là không đủ "bậc hai " cho nó).
laxxy

Câu trả lời:



5

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)]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.