我有一个优化问题如下。
给定一组正整数,例如(y1 = 2, y2 = 3, y3 = 1, y4 = 4, y5 = 3)
,我的目标是最大化函数f(x)
的值的总和,否则f(x) = x if x + y <= m
和f(x) = 0
。 (m
是一个正整数)
例如,在上面的这个特定示例中(使用m = 5
),最佳x
值为2
,因为总和为2 + 2 + 2 + 0 + 2 = 8
,这是最高的x
的其他可能值(隐含地,可能x
的范围为0
和5
)
我当然可以详尽地计算并比较所有可能的x值导致的总和,并选择给出最高总和的x,前提是x的范围相当小。但是,如果范围变大,这种方法可能会变得过于昂贵。
我想知道我是否可以使用线性编程之类的东西来更普遍和正确地解决这个问题。
答案 0 :(得分:3)
这里不需要线性编程,只需要一次排序和一次通过来确定最佳x。
伪代码是:
getBestX(m, Y) {
Y = sort(Y);
bestSum = 0;
bestX = 0;
for (i from 0 to length(Y)) {
x = m - Y[i];
currSum = x * (i + 1);
if (currSum > bestSum) {
bestSum = currSum;
bestX = x;
}
}
return bestX;
}
每个i
的注意事项我们知道,如果x = m - Y[i]
,那么f(x) = x
代表i
的每个元素,f(x) = 0
以及之后每个元素的{{1}},因为Y是按升序排列的。