我有一个困扰我的组合问题。我希望有人给我他们的想法并指出我是否遗漏了一些我可能忽略的明显解决方案。
假设有一家商店从一家供应商处购买所有商品。供应商有一个待售物品清单。每个项目都具有以下属性:
size, cost, quantity, m, b
m
和b
是以下等式中的常量:
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更多。因此,这将涉及从当前最有利可图的项目跳到下一项,直到资源耗尽。我能做到这一点,但这似乎是一种丑陋的方式。我考虑过动态编程,但由于项目的利润密度会根据您购买的金额而变化,因此无法为此提出解决方案。
我考虑过多元线性回归,并且“考虑”我的意思是我对自己说“多线性回归是一种选择吗?”然后什么都不做。
我的蜘蛛般的感觉告诉我,有一种更明显的方法让我盯着我,但我没有看到它。请帮助我同时踢自己和facepalm。
答案 0 :(得分:1)
如果您将此视为多变量优化中的一个简单练习,其中可控变量是已购买的数量,那么您将根据线性约束优化二次函数。
如果使用拉格朗日乘数并进行微分,则得到每个涉及自身的量变量的线性方程,并将拉格朗日乘数作为唯一的未知数,并且约束为您提供涉及所有量的单个线性方程。因此,将每个数量写为拉格朗日乘数的线性函数,并将其替换为约束方程,以获得拉格朗日乘数中的线性方程。解决这个问题,然后将拉格朗日乘数插入更简单的方程式中以得到数量。
如果您可以根据需要购买分数和负数,这将为您提供解决方案。显然你不是,但你可能希望没有什么是非常消极的,你可以围绕非整数量来得到一个合理的答案。如果这对你来说还不够好,你可以用它作为分支和绑定的基础。如果你对其中一个数量的价值做出假设并以这种方式求解其他数量,那么你就得到了可能的最佳答案的上限 - 预测的利润忽略了现实世界对非负性的约束和整数值将永远是如果你必须遵守这些限制条件,至少可以获得利润。
答案 1 :(得分:0)
您可以将此视为动态编程练习,以充分利用有限的资源。
作为一个简单的例子,考虑只是满足空间约束并忽略成本。然后,您希望找到为可用空间带来最大利润的项目。选择单位,以便表示用作整数的空间是合理的,然后,对于i = 1到项目的数量,计算,对于每个整数值的空间,直到限制,选择给出的第一个i项目大多数人返回这个空间。像往常一样,你可以从i的答案中找出i + 1的答案:对于从0到空间限制的每个值,只考虑第i + 1项的所有可能数量,直到该空间量,并且工作使用该项目数量的合并回报,然后根据您已经为第一个i项目制定的答案使用剩余空间。当我达到项目总数时,您将为您实际想要解决的问题找到最佳回报。
如果你有空间和成本的约束,那么动态程序的状态不是单个变量(空间)而是一对变量(空间,成本),但你仍然可以解决它,尽管有更多的工作。考虑(空间,成本)从(0,0)到实际约束的所有可能值 - 您有一个2维的计算返回表,而不是从0到最大空间的单个值集。但你仍然可以从i = 1到N工作,为每个(空间,成本)限制计算第一个i项目的最高回报,并使用i的答案来计算i + 1的答案。