후보의 선택을 최적화해야하는 문제가 있습니다. 각 후보자는 점수 (0과 1 사이), 유형 (1에서 10까지의 10 가지 선택 사항) 및 수량을가집니다.비선형 제약 조건 및 이진 변수를 사용하는 선형 목적 함수
최적화 할 변수는 바이너리입니다. 그들은 후보자의 선택을 대표하거나 아닙니다. 객체 함수는 선형이며, 이진 변수와 스코어 벡터의 스칼라 곱입니다. 아이디어는 가장 높은 점수 합을 선택하는 것입니다.
는 지금은 선형 제약이 있습니다 최대 35될 수 있습니다 선택할 수있는 후보의 수를하지만 나 또한 10 비선형 제약이 있습니다 후보자의 10 종류가 있습니다. 마지막 선택에서, 각 유형의 총 수량은 모든 유형의 총 수량의 많아야 10 %이어야합니다.
나는 따라서 이진 변수를 처리하지만 비선형 제약에 대처하기 위해 고군분투하고 있기 때문에intlinprog
를 사용하여 코드를 작성했다. 선형화를 시도하거나 다른 솔버를 사용하는 것이 가장 좋은지 확실하지 않습니다.
rng('default');
clc;
clear;
n = 100;
maxSize = 35;
nbType = 10;
NAV = 6000000;
thresholdType = 0.1 * NAV;
%%%TOP BASKET
score = rand(n,1)/10+0.9;
quantity = rand(n,1)*300000;
type = ceil(rand(n,1)*nbType);
typeMask = zeros(n,nbType);
for i=1:nbType
typeMask(:,i) = type(:,1) == i;
end
f = -score;
intcon = [1:1:n];
%Write the linear INEQUALITY constraints:
A = [ones(1,n);bsxfun(@times,typeMask,quantity)'/thresholdType];
b = [maxSize;ones(nbType,1)];
%Write the linear EQUALITY constraints:
Aeq = [];
beq = [];
%Write the BOUND constraints:
lb = zeros(n,1);
ub = ones(n,1); % Enforces i1,i2,...in binary
%x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub);
x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub);
문제는, 내 A, B의 첫 번째 제약은 선형 일 (최대 35 후보)와 지난 10가 너무 분명 비선형가 있습니다 : 여기
코드입니다 올바른 결과를주지 못한다.
안녕과에 유래 환영합니다. 설명을 위해 질문에 답글을 쓸 수 있습니다. – obchardon
아니, 할 수 없어. 너는 나를 허락하지 않을 것이기 때문이다. – Chris
아니요, 그보다 조금 더 복잡합니다.각 후보자는 그것에 첨부 된 수량을가집니다. 그러면 한 가지 유형의 각 후보자의 합계는 모든 유형의 모든 선택된 후보자의 전체 수량의 10 %를 넘을 수 없습니다. 기본적으로 최적화가 끝나면 최적화 된 선택 항목 (최대 35 개의 후보)을보고 싶습니다. 그리고 1 개 유형의 모든 후보에 대해 수량을 합하면이 값은 10 개보다 작거나 같습니다. 선택된 모든 후보자의 수. 그것이 더 명확하길 바래요? – Tulkkas