分配给定资源(例如预算)以获得最佳产出的最佳方式



我正在尝试找到一种解决方案,其中给定的资源(例如预算)将最好地分配给不同的选项,从而对所提供的资源产生不同的结果。

假设我有N = 1200和一些功能。(a,b,c,d是一些未知变量)

f1(x) = a * x
f2(x) = b * x^c
f3(x) = a*x + b*x^2 + c*x^3
f4(x) = d^x
f5(x) = log x^d
...

而且,假设这些函数n数量根据其输入x产生不同的结果,其中x = 0 or x >= m,其中m是一个常数。

虽然我无法找到给定函数的确切公式,但我能够找到输出。这意味着我可以做到:

X = f1(N1) + f2(N2) + f3(N3) + ... + fn(Nn)(N1 + ... Nn) = N与将N分配到n数字的方法一样多的地方,并找到X最大的特定情况。

我实际上如何使用当前可用的库以最少的计算能力找到N的最佳分布?

如果您对限制为整数的分配感到满意,那么有一个成本为 O(Nn) 的动态编程解决方案 - 因此您可以根据需要通过缩放来提高准确性,但这会增加 CPU 时间。

对于每个 i=1 到 n 维护一个数组,其中元素 j 仅使用前 i 函数给出最大产量,使它们的总容许为 j。

对于 i=1,这只是 f1() 的结果。

对于 i=k+1,在计算 j 的结果时考虑在 f_{k+1}() 和告诉您前 k 个函数之间分布的最佳回报的表之间拆分 j 单位的每种可能方法 - 因此您可以使用为 k 创建的表计算 i=k+1 的表。

最后,您将获得 n 个函数和 N 个资源的最佳回报。如果您维护一组数组,告诉在第一个 i 函数之间分配 k 个单位的最佳方式,对于 i 和 k 的所有可能值,那么更容易找出最佳答案是什么。然后你可以查找 f100() 的最佳分配,从 N 中减去分配给 f100() 的值,在给定结果资源的情况下查找 f99() 的最佳分配,然后继续这样做,直到你为所有 f() 计算出最佳分配。

例如,假设 f1(x) = 2x,f2(x) = x^2 和 f3(x) = 3,如果 x>0,否则为 0。假设我们有 3 个资源单位。

第一个表只是 f1(x),对于 0,1,2,3 个单位,它是 0、2、4、6。

第二个表是使用 f1(x) 和 f2(x) 对 0,1,2,3 个单位执行的最佳操作,为 0、2、4、9,在 x=2 时从 f1 切换到 f2。

第三个表是 0、3、5、9。我可以通过使用 f3() 的 1 个单位获得 3 和 5,其余的用于第二个表中的最佳解决方案。9 只是第二个表中的最佳解决方案 - 使用 3 个资源没有更好的解决方案可以将其中任何一个提供给 f(3)

所以9是这里最好的答案。弄清楚如何到达那里的一种方法是保持表格并重新计算答案。9 来自第二个表中的 f3(0) + 9,因此所有 3 个单位都可用于 f2() + f1()。第二个表 9 来自 f2(3),所以 f(1) 没有剩余的单位,我们得到 f1(0) + f2(3) + f3(0)。

当您在阶段 i=k+1使用要使用的资源时,您有一个表格形式 i=k,它准确地告诉您在决定在阶段 i=k+1 使用一些资源后剩余资源所期望的结果。最佳分布不会变得不正确,因为该阶段 i=k 您已经计算出给定每个可能的剩余资源数量的最佳分布的结果。

最新更新