在给定 R 中的某些约束的情况下计算一组最佳行

Posted

技术标签:

【中文标题】在给定 R 中的某些约束的情况下计算一组最佳行【英文标题】:Calculating an optimum set of rows given certain constraints in R 【发布时间】:2016-02-03 05:13:50 【问题描述】:

抱歉标题含糊不清,但设置如下:

我有一个零件清单,每个零件都有制造商、成本和利润。我将添加一个 sn-p,但这将是一个很长的列表(数十个制造商,数百个零件)。

Manufacturer    Part Name   Cost    Profit
Cohiba          Behike 54   10.95   5.05
Rocky Patel     Edge        13.99   8.01
Acid            Liquid      8.49    3.51

我有一个代码,它对每个唯一的制造商进行抽样,为每个制造商随机选择一个零件,然后计算总成本和利润。

ind <- sapply (unique( data$Manufacturer ) , function(x)
  sample( which(data$Manufacturer==x) , 1 ) )

Sampler <- data[ ind, ]

sum(Sampler$Profit)

sum(SamplerX$Cost)

我觉得必须有一种更聪明的方法来要求它简单地找到每个制造商的一个独特零件的最佳列表,从而以最低的成本为我提供最高的利润。谁能给我一些见解?

【问题讨论】:

您打算如何决定选择一个零件?一种选择是始终首先选择最高的利润,然后在平局的情况下选择较低的成本。还是您有不同的启发? 对,对我来说,下一步是我对总成本有一个固定的预算。实际的部分并不重要,我想这部分是我希望它向我吐口水的解决方案。我试图让它告诉我哪种独特部件的组合将在我的预算范围内给我带来最大的利润。这有助于回答您的问题吗? 您实际上是在问两个问题,每个问题都很难回答。一旦你选择了一个算法(第一部分),那么你需要 R 代码来执行它(第二部分)。您可能想选择一种算法,然后用它更新您的问题。 我想我想要它做的是创建每个唯一制造商的一个零件的所有组合的排列,然后在总成本低于 X 值时找到最大利润,然后告诉我什么部分的组合是产生利润的。 这似乎是背包问题(离散优化)的一个实例,正如@Tim 所说,这远非微不足道。在尝试编写解决方案之前,您可能需要寻找不同的方法(算法)来解决它 【参考方案1】:

为了完整性:

背包问题是强盗想要最大化被盗物品的价格,同时将重量保持在或低于他的麻袋容量的问题。 adagio 包有解决它的功能。

library(adagio)
# create some random data:
set.seed(1)
weights <- sample(1:100,30,FALSE)
prices <- sample(1:10000,30,FALSE)

# find what is the total weight
sum(weights)
[1] 1383

# Solve the problem, allowing a capacity of about 10% the total weight:
a <- knapsack(w=weights, p=prices, cap=138)

# See what a returns:
a
$capacity
[1] 138

$profit
[1] 50928

$indices
[1]  1  5 10 11 12 19 22 27

# validate results:
sum(weights[a$indices])
[1] 138

请记住,如果您的向量很大,您将需要大量容量。

####### 编辑添加#######

考虑到您希望在将成本保持在一定限度以下的同时实现利润最大化,并且不超过一定数量的制造商(一个,在您的问题中),这是一个二维背包问题,我没有找到任何解决它的函数或包。

替代方案:

    自己编码:一个好的开始是adagio::knapsack(没有括号,所以你可以看到代码),然后谷歌搜索“二维背包”。伪代码中有很多算法,所以你不会从一张白纸开始。 一种解决方法:如果您的输出向量不是很大,您可以使用adagio::knapsack()不管制造商并找到一个接近的解决方案。然后,您必须手动查找结果向量中重复的制造商,然后找到一个尽可能接近要替换的项目成本低于并且属于不同的项目,尚未使用的制造商,具有最高的利润。 请注意,这不一定会产生最佳可用解决方案,即最优解(问题是 NP-hard,所以无论如何它可能不会),但这将是一个很好的近似值。

【讨论】:

我可以与您联系以帮助澄清我在修改此内容时遇到的一些问题吗?你说得对,这是一个非常复杂的问题,在我尝试提出另一个问题以寻求代码帮助之前,我需要帮助集中我的想法。 如果答案对您有用,您可以考虑在投票按钮下方使用勾选标记标记为已接受。【参考方案2】:

我必须完全感谢 PavoDive 帮助我解决了这个问题。他对“背包问题”这个短语的使用让我头晕目眩,因为我从中学起就没有听过背包谜语的版本。

一旦他这么说,我就能够快速连接点,实际上发现已经存在一个包来解决这个精确设置的背包问题:

http://www.inside-r.org/packages/cran/adagio/docs/knapsack

我需要的答案就在那里。分享这个以防其他人需要解决这个问题。

【讨论】:

以上是关于在给定 R 中的某些约束的情况下计算一组最佳行的主要内容,如果未能解决你的问题,请参考以下文章

在给定稀疏矩阵数据的情况下,Python 中计算余弦相似度的最快方法是啥?

如何计算向量中的位数? (在 R 中)

在给定开始和结束时间的情况下计算并发会话

是否可以计算 R 中的算术运算次数?

UITableViewCell 高度根据行内容使用自动布局动态计算

使用 Dijkstra 计算的算法