【发布时间】:2016-10-06 17:44:49
【问题描述】:
我有一个关于优化的问题。
我有一个矩阵 x,它有 3 列和一定数量的行(最多 200)。每行代表一个候选人。第一列包含一个分数(介于 0 和 1 之间),第二列包含候选者的种类(从 1 到 10 共标记了 10 种),第三列包含每个候选者的数量。需要考虑一件事:金额可以是负数
我想做的是在这些候选者中选择最多 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 将非常困难(在我看来可能是非凸的)。 -
这里的 10% 规则应该理解为:选择完成后的 sum_amount_kind_x,这意味着尊重其他约束,例如 max 35 个元素不应大于 sum_all_amounts_selected 的 10%。所以我相信这不幸地属于你的 B 类。因为基本上A部分没有多大意义。我希望在选择后的每个类别中最多有 10%。希望这能澄清一点。
标签: matlab optimization constraints dynamic-programming linear-programming