我有一个关于优化的问题。约束下的优化
我有一个矩阵x有3列和一定数量的行(最大200)。每一行代表一个候选人。第一列包含一个分数(在0和1之间),第二列包含候选人的种类(总共有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,这意味着尊重其他约束,如最大35个元素不应该大于sum_all_amounts_selected的10%。所以我相信这不幸落入你的B类别。因为基本上A部分没有什么意义。我希望在选择后的每个类别中选择最多10%。希望澄清一点。 – Tulkkas