【问题标题】:How do I calculate the most profit-dense combination in the most efficient way?如何以最有效的方式计算利润最密集的组合?
【发布时间】:2015-10-30 01:15:01
【问题描述】:

我有一个困扰我的组合问题。如果我遗漏了一些我可能忽略的明显解决方案,我希望有人给我他们的想法并指出。

假设有一家商店从一个供应商处购买其所有用品。供应商有一份待售物品清单。每个项目都有以下属性:

size, cost, quantity, m, b

mb 是以下等式中的常数:

sales = m * (price) + b

这条线向下倾斜。该等式告诉我,如果我收取该特定价格,我将能够出售多少该商品。每个项目都有自己的 m 和 b 值。

假设商店的存储空间有限,资金有限。这家商店希望在其仓库中装满利润最高的商品。

(顺便说一下,利润密度 = 利润/尺寸。我将利润密度定义为仅与商品尺寸有关。我可以使用与尺寸有关的密度成本,但要做到这一点,我必须知道仓库空间的成本。这不是我目前知道的数字,所以我只使用大小。)

购买越多,商品的利润密度就会下降(见下文。)

如果我翻转线方程,我可以看到在给定时间段内出售给定数量的物品需要收取的价格。

price = (sales-b)/m

所以如果我买了 n 件商品,想全部卖掉,我就得收费了

price = (n-b)/m

由此产生的收入将是

price*n = n*(n-b)/m

利润是

price*n-n*cost = n*(n-b)/m - n*cost

利润密度为

(n*(n-b)/m - n*cost)/(n*size)

或者,等价

((n-b)/m - cost)/size

假设我有一个表格,其中包含每个可用项目以及每个项目的利润密度。

问题是,为了最大化商店的利润,我应该购买每件商品的数量?

一种可能性是在成本和空间的范围内生成所有可能的项目组合,并选择具有最高盈利能力的组合。在 1000 个项目的列表中,这需要很长时间。 (我试过这个,1000 个列表花了 17 秒。太可怕了。)

我尝试过的另一个选择(在纸上)是选择列表中最赚钱的两个项目。让我们称最有利可图的项目 A、第二高利润的项目 B 和第三高利润的项目 C。我尽可能多地购买项目 A,直到它的利润低于项目 B。然后我使用 B 重复此过程和 C,对于列表中的每个项目。

但是,可能是这样的,在购买 B 项之后,A 再次成为最有利可图的项目,比 C 更多。所以这将涉及从当前最有利可图的项目跳到下一个,直到资源耗尽。我可以这样做,但这似乎是一种丑陋的方式。

我考虑过动态规划,但由于商品的利润密度会根据您购买的数量而变化,因此我无法对此提出解决方案。

我考虑过多元线性回归,“考虑”是指我对自己说“多元线性回归是一种选择吗?”然后什么也没做。

我的蜘蛛侠感觉告诉我,有一种更明显的方法在盯着我看,但我没有看到。请帮我同时踢自己和打脸。

【问题讨论】:

    标签: algorithm recursion combinations dynamic-programming


    【解决方案1】:

    如果您将此视为多元优化中的简单练习,其中可控变量是购买的数量,那么您正在优化受线性约束的二次函数。

    如果您使用拉格朗日乘子并进行微分,那么您会为每个涉及自身的量变量和拉格朗日乘子作为唯一的未知数得到一个线性方程,并且该约束会为您提供一个涉及所有量的单个线性方程。所以将每个量写成拉格朗日乘数的线性函数,代入约束方程,得到拉格朗日乘数的线性方程。解决这个问题,然后将拉格朗日乘数代入更简单的方程以获得数量。

    如果允许您在需要时购买少量和负数的东西,这将为您提供解决方案。显然你不是,但你可能希望没有什么是非常负面的,你可以对非整数进行四舍五入以获得合理的答案。如果这对您来说还不够好,您可以将其用作分支定界的基础。如果您对其中一个数量的值进行假设并以这种方式求解其他数量,您将获得可能的最佳答案的上限 - 忽略现实世界对非负性和整数值的约束的利润预测将始终为如果您必须遵守这些限制条件,至少是赚取的利润。

    【讨论】:

      【解决方案2】:

      您可以将此视为动态编程练习,以充分利用有限的资源。

      作为一个简单的例子,考虑只满足空间限制而忽略成本限制。然后,您想找到对可用空间产生最大利润的项目。选择单位,以便将空间表示为整数是合理的,然后,对于 i = 1 到项目数,计算出对于空间的每个整数值,直到限制,选择前 i 个项目,给出该空间量的最大回报。像往常一样,您可以从 i 的答案中计算出 i+1 的答案:对于从 0 到空间限制的每个值,只需考虑直到该空间量的第 i+1 项的所有可能数量,然后工作根据您已经为前 i 个项目计算出的答案,从使用该数量的项目然后使用剩余空间的组合回报。当我达到项目总数时,您将为您实际想要解决的问题计算出最佳回报。

      如果你对空间和成本都有约束,那么动态程序的状态不是单个变量(空间)而是一对变量(空间,成本),但你仍然可以解决它,尽管需要更多的工作。考虑从 (0, 0) 到实际约束的 (space, cost) 的所有可能值——你有一个二维的回报表来计算,而不是从 0 到最大空间的一组值。但是您仍然可以从 i=1 工作到 N,计算每个(空间、成本)限制的前 i 个项目的最高可能回报,并使用 i 的答案来计算 i+1 的答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-13
        • 1970-01-01
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 2016-12-22
        • 2021-12-22
        • 1970-01-01
        相关资源
        最近更新 更多