【问题标题】:Optimization under constraints约束下的优化
【发布时间】: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% 规则是什么意思? Asum_amount_kind_x / sum_all_amountsBsum_amound_kind_x_selected / sum_all_amounts_selectedA 是一个简单的混合整数程序。 B 将非常困难(在我看来可能是非凸的)。
  • 这里的 10% 规则应该理解为:选择完成后的 sum_amount_kind_x,这意味着尊重其他约束,例如 max 35 个元素不应大于 sum_all_amounts_selected 的 10%。所以我相信这不幸地属于你的 B 类。因为基本上A部分没有多大意义。我希望在选择后的每个类别中最多有 10%。希望这能澄清一点。

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


【解决方案1】:

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

  • n 是候选人的数量。
  • S[x] 是候选人x 的分数。
  • A[i][x]x 的候选对象 i 的数量(A[i][x] 可以是正数或负数,就像你说的那样)。
  • T[i] 是 kind i 的所有候选人的总数。
  • 如果要包含元素 xI[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() <= 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 是一个等于<A[i]1, A[i]2, ..., A[i]n>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 已经用作先前约束的松弛变量。


总之,线性规划看起来像这样(为每个不等式约束添加 11 个松弛变量 x1, x2, ..., x11):

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

希望这很清楚,对于糟糕的格式表示抱歉。

【讨论】:

  • 这不是线性程序。这是一个混合整数程序。我还认为您误解了 10% 规则(但也许不是;我在 cmets 中问过)。
  • 啊,你是对的。应该是一个给定的种类最多可以包含被选择元素数量的 10%,而不是一个种类只能占总量的 10%。我会修正我的答案
  • 也许就是这样。在更改您的答案之前,我会先等待回复。我也很好奇你会如何处理它。我认为这并不容易。
  • 我已经回答了你的 cmets Sasha。布赖恩,你的答案是已经编辑过的还是原来的?
  • 还是原创,不知道你回答了 sascha 的问题
【解决方案2】:

我相信 MIP 模型可以如下所示:

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

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

【讨论】:

  • 我想我明白了,但我很难写下类型的约束,你称之为 vlimit。实际上 totalv 和 vj 依赖于相同的变量。你会怎么用 Matlab 写这个?我试过这个:写线性不等式约束:A = [ones(1,n);bsxfun(@times,sectorTopMask,quantityTop)']; b = [maxSize;0.1*ones(10,1).*sum(sum(bsxfun(@times,sectorTopMask,quantityTop)',2))];
  • 这在 Matlab 中编写起来并不容易,因为您必须创建两个大矩阵(一个用于等式约束,一个用于不等式约束)。每个变量都是这些矩阵中的一列。这很痛苦,恐怕它需要相当多的代码。 Here 是一个与其他建模系统相比难度有多大的例子。
  • 我可以和你分享我当前的代码吗?只是为了看看它的样子,因为在我这边,你提供给我的例子似乎要简单得多,但不知何故,即使找到了解决方案,10% 的约束也没有得到尊重。我相信我以某种方式写错了。
  • 仅在附有采购订单的情况下。
  • 谢谢你的帮助,但我不打算买任何东西!我会想办法的!
猜你喜欢
  • 1970-01-01
  • 2021-08-18
  • 2020-01-17
  • 2021-12-28
  • 2018-05-03
  • 2012-12-08
  • 2011-07-23
  • 2019-06-25
  • 2017-11-13
相关资源
最近更新 更多