У меня проблема, когда мне нужно оптимизировать выбор кандидатов. Каждый кандидат имеет оценку (от 0 до 1), тип (10 вариантов от 1 до 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 являются нелинейными, так это, очевидно, не дает правильного результата.
Привет и добро пожаловать в stackoverflow. Для уточнения вы можете написать свой вопрос в комментарии. – obchardon
Нет, я не могу, потому что ты не позволь мне. – Chris
Нет, это немного сложнее.У каждого кандидата есть количество, прикрепленное к нему. Тогда сумма количества каждого выбранного кандидата одного типа не может составлять более 10% от общего количества всех выбранных кандидатов всех типов. В принципе, в конце оптимизации я хочу посмотреть на мой оптимизированный выбор (максимум 35 кандидатов) и что, когда я суммирую количество для всего кандидата 1 типа, это значение меньше или равно 10% от суммы количество выбранных кандидатов. Надеюсь, это яснее? – Tulkkas