约束下的优化

时间:2016-10-03 15:14:23

标签: matlab optimization constraints dynamic-programming linear-programming

我有一个关于优化的问题。

我有一个矩阵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);

如果我做错了,我会感激一些建议!

2 个答案:

答案 0 :(得分:0)

模型的线性程序可能如下所示:

  • n是候选人数。
  • S[x]是候选人x的得分。
  • A[i][x]是种类x的候选i的数量(A [i] [x]可以是正数或负数,就像你说的那样)。
  • T[i]是所有候选人i的总金额。
  • 如果要包含元素I[x],则
  • x为1,如果要排除元素x则为0。

您要优化的函数fS[x]I[x]的函数。您可以将SI视为n维向量,因此您要优化的函数就是它们的点积。

f() = DotProduct(I, S)

这相当于线性函数I1 * S1 + I2 * S2 + ... + In * Sn

我们可以用这种方式表达所有约束,以获得一组线性函数,其系数是n维向量中的组件,我们可以用I点,即要优化的参数。

对于我们最多只能占用35个元素的约束,让C1()成为计算元素总数的函数。 然后第一个约束可以形式化为C1() <= 35C1()是一个线性函数,可以这样计算:

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](): 设kn维度向量等于<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)

我相信MIP模型看起来像:

enter image description here

此处i是数据点,j表示类型。为简单起见,我假设每个类型都有相同数量的数据点(即Amount(i,j)Score(i,j)是矩阵)。通过限制求和很容易处理更不规则的情况。

10%规则仅适用于金额总和。我希望这是正确的解释。如果我们有负数,不确定这是否属实。