У меня есть вопрос относительно оптимизации.Оптимизация под ограничениями
У меня есть матрица x с 3 столбцами и определенное количество строк (макс. 200). Каждая строка представляет кандидата. В первом столбце содержится оценка (от 0 до 1), столбец 2 содержит вид кандидата (всего 10 видов, помеченных от 1 до 10), а столбец 3 содержит количество каждого кандидата. Следует учитывать одно: сумма может быть ОТРИЦАТЕЛЬНОЙ
Что я хотел бы сделать, так это выбрать максимум 35 элементов среди этих кандидатов, которые максимизируют функцию, которая суммируется по их соответствующей оценке (столбец 1) под ограничения могут составлять не более 10% каждого вида, рассчитанные следующим образом: процентное соотношение вида 1: сумма суммы вида 1, деленная на сумму всей суммы.
В конце я хотел бы иметь набор из 35 кандидатов, которые удовлетворяют ограничениям и оптимизируют сумму своих баллов.
Вот код, который я придумал до сих пор, но я изо всех сил на 10% ограничение, как кажется, не следует принимать во внимание:
rng('default');
clc;
clear;
n = 100;
maxSize = 35;
%%%TOP BASKET
nbCandidates = 100;
score = rand(100,1)/10+0.9;
quantity = rand(100,1)*100000;
type = ceil(rand(100,1)*10)
typeMask = zeros(n,10);
for i=1:10
typeMask(:,i) = type(:,1) == i;
end
fTop = -score;
intconTop = [1:1:n];
%Write the linear INEQUALITY constraints:
A = [ones(1,n);bsxfun(@times,typeMask,quantity)'/sum(type.*quantity)];
b = [maxSize;0.1*ones(10,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 = intlinprog(fTop,intconTop,A,b,Aeq,beq,lb,ub);
Я был бы признателен за некоторые советы где Я делаю это неправильно!
Что вы подразумеваете под правилом 10%? ** A **: '' 'sum_amount_kind_x/sum_all_amounts'' или ** B **:' '' sum_amound_kind_x_selected/sum_all_amounts_selected'''. ** A ** - простая смешанная целая программа. ** B ** будет невероятно сложно (на мой взгляд, возможно, не выпуклым). – sascha
Здесь 10% правил следует понимать так: sum_amount_kind_x после завершения выбора, что означает, что соблюдение других ограничений, таких как max 35 элементов, не должно превышать 10% от sum_all_amounts_selected. Поэтому я верю, что это, к сожалению, попадает в вашу категорию B. Потому что в основном часть A не имеет большого смысла. Я хочу иметь после выбора максимум 10% в каждой категории в рамках выбора. Надеюсь, это немного разъясняет. – Tulkkas