我有一个关于优化的问题。
我有一个矩阵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);
如果我做错了,我会感激一些建议!
答案 0 :(得分:0)
模型的线性程序可能如下所示:
n
是候选人数。S[x]
是候选人x
的得分。A[i][x]
是种类x
的候选i
的数量(A [i] [x]可以是正数或负数,就像你说的那样)。T[i]
是所有候选人i
的总金额。I[x]
,则x
为1,如果要排除元素x
则为0。您要优化的函数f
是S[x]
和I[x]
的函数。您可以将S
和I
视为n
维向量,因此您要优化的函数就是它们的点积。
f() = DotProduct(I, S)
这相当于线性函数I1 * S1 + I2 * S2 + ... + In * Sn
。
我们可以用这种方式表达所有约束,以获得一组线性函数,其系数是n
维向量中的组件,我们可以用I
点,即要优化的参数。
对于我们最多只能占用35个元素的约束,让C1()
成为计算元素总数的函数。
然后第一个约束可以形式化为C1() <= 35
,C1()
是一个线性函数,可以这样计算:
让j
成为n
维向量,每个组件等于1:j = <1,1,...,1>
。
C1() = DotProduct(I, j)
所以C1() <= 35
是线性不等式,相当于:
I1 * 1 + I2 * 1 + ... + In * 1 <= 35
I1 + I2 + ... + In <= 35
我们需要在这里添加一个松弛变量x1
以将其转换为等价关系:
I1 + I2 + ... + In + x1 = 35
对于我们每种只能占10%的约束,我们将为每种C2[i]()
设置一个函数i
(你说总共有10个)。 C2[i]()
根据我们选择的学生,计算为i
种类的学生数量:
C21() <= .1 * T1
C22() <= .1 * T2
...
C210() <= .1 * T10
我们像这样计算C2[i]()
:
设k
为n
维度向量等于<A[i]1, A[i]2, ..., A[i]n>
,每个组件是种类i
的每个候选者的数量。
然后DotProduct(I, k) = I1 * A[i]1 + I2 * A[i]2 + ... + In * A[i]n
,是我们对i
给出的I
的总量,C2[i]() = DotProduct(I, k)
是一个捕获我们所包含的元素的向量。
所以C2[i]()
现在我们知道如何计算C2[i]() + x[i + 1] = .1 * T[i]
,我们需要添加一个松弛变量来将其转换为相等关系:
x
此处[i + 1]
的下标为x1
,因为x1, x2, ..., x11
已用作上一个约束的松弛变量。
总之,线性程序看起来像这样(为每个不等式约束添加11个松弛变量Let:
V = <I1, I2, ..., In, x1, x2, ..., x11> (variables)
|S1|
|S2|
|. |
|. |
|. |
P = |Sn| (parameters of objective function)
|0 |
|0 |
|. |
|. |
|. |
|0 |
|35 |
|.1*T1 |
C = |.1*T2 | (right-hand sides of constraining equality relations)
|... |
|.1*T10|
|1 |1 |...|1 |1|0|...|0|
|A1,1 |A1,2 |...|A1,n |0|1|...|0|
CP = |A2,1 |A2,2 |...|A2,n |0|0|...|0| (parameters of constraint functions)
|... |... |...|... |0|0|...|0|
|A10,1|A10,2|...|A10,n|0|0|...|1|
Maximize:
V x P
Subject to:
CP x Transpose(V) = C
):
{{1}}
希望这很清楚,抱歉可怕的格式化。
答案 1 :(得分:0)