在给定数值表的情况下,如何在“团购”中找到最好的“交易”

3

使用PHPPython,但我确定基本函数是不可知的。

我不确定正确的术语、数学理论或算法是什么,否则我相信谷歌会在几分钟内为我解决这个问题。

我有一个类似于以下数据集的数据:

cost | qty | ppl | store
------------------------
   30|  500|   10|     1
   40|  600|   12|     2
   35|  500|   14|     3
   50|  700|   10|     1
   30|  700|   12|     1
   40|  250|   14|     2

我想做的是基于以下限定条件找到“最佳”的行:
  • 成本:成本越低越好。
  • 数量:数量越多越好。
  • 人均成本:人均成本越低越好。
  • 店铺:在这种情况下并不重要,但稍后会用于根据“店铺”找到“最佳”。
本质上,我试图在“团购”类似的情况中找到最好的“交易”,即需要最少的人数以获得最佳的“价值”(数量与成本)。
在我看来,总体最好的可能是第5行,因为数量有所增加。
如果有一个名称和一个好的(维基百科?)关于这个主题的文章,我很高兴自己完成。谢谢您的时间!

jimbob帮助指出我可能没有说明清楚每个字段/数字代表什么。 这里的成本是每个人的总成本,数量是每个人所收到的物品数量(糖果片?),而“ppl”/人则是需要的人数以便获得特定交易。 如果这不清楚,对不起。 - anonymous coward
在这种情况下,没有“正确”的答案。您应该更多地模拟您的问题。例如:复制成本或人员与将数量除以2一样糟糕吗? - Dr. belisarius
3个回答

5

计算qty / (cost * ppl)并按该数字排序列表。对于更高的qty和较低的costppl,此数字将更高。

您可能想使用类似以下内容的代码(python):

def cmp(a, b):
    return (a["qty"] / (a["cost"] * a["ppl"])) - (b["qty"] / (b["cost"] * b["ppl"]))

list = sorted(list, cmp)
解释:想象一下当qty增加时,cost * ppl不变会发生什么。比率会增加,因为如果a > b,那么a/x > b>x。现在对于另外两个值,情况正好相反;如果x/a > x/b,那么a < b,所以当costppl增加时,比率实际上会减小(想象一下如果你把100美元分给两个人和三个人会发生什么;如果你分给两个人,每个人将得到100/2 = 50美元。如果你分给三个人,每个人将得到100/3 ~= 33美元,这比较少)。(如果我表述不够清楚,请见谅,我有些累了)

最好传递一个 key 参数给 sorted 而不是 cmp(你忘记传递了)。 - Jon-Eric
@Jon-Eric 哎呀,已经修复了。谢谢! - Gabi Purcaru
这似乎按预期工作。有没有人能指导我一下为什么会这样?我不确定如何表达这个问题,但本质上我对数学有点无知(并试图解决这个问题!)。这个解决方案似乎很好,但我想自己能够想出这些东西,对其背后的数学有更好的理解(尽管它可能很基础),等等。 - anonymous coward
您的最优标准既与数量成正比,又与成本和“人均产出”成反比。每行的结果“qty / (cost * ppl)”是这种最优性的指标。基于此数字将每行与其他行进行比较,即可得到所需的结果。 - Adriano Varoli Piazza
感谢Adriano,特别是Gabi添加解释!太棒了。 - anonymous coward

1

谢谢提供这个资源!我对数学不太熟悉,所以单纯形算法的文章有点难读。我会尽力的! - anonymous coward
@anon:我正在攻读数学学位,但我发现单纯形算法很难理解!幸运的是,困难的工作已经完成了,因为这是一种非常标准的问题。维基百科文章列出了几个实现它和其他类似算法的Python库。 - Katriel

0

你需要决定什么是最优的,定义一个依赖于成本、数量、人数的函数,并将其最大化/最小化。然后就是优化问题。

我假设成本是每件物品的成本,数量是商店中可用的数量,人数是启动团购所需的最低人数。那么,将成本*人数/数量最小化等价于将在它启动之前必须花费的最小总金额除以可能参与团购的人数进行最小化。但你仍然需要思考这是否有意义。你可能会说,如果成本翻倍,但可用数量也翻倍,那么这个团购比较小的团购更差。也许如果成本翻倍,数量必须增加4倍,或者所需的人数减少4倍。然后你可能需要一个像成本^2 人数/数量这样的函数。例如,一般来说,成本^m 人数^n/数量^p 这样的函数应该可以解决问题;你只需要根据你认为合适的权重调整 m、n、p(都是正数)。


感谢您指出我没有很清楚地说明这些数字实际代表什么。在这种情况下,Cost是总成本,Qty是包括的物品数量(每人),而Ppl则是需要达到特定交易的人数。 =) - anonymous coward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接