Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中计算给定某些约束的最佳行集_R_Mathematical Optimization_Knapsack Problem - Fatal编程技术网

在R中计算给定某些约束的最佳行集

在R中计算给定某些约束的最佳行集,r,mathematical-optimization,knapsack-problem,R,Mathematical Optimization,Knapsack Problem,很抱歉,标题听起来很模糊,但设置如下: 我有一份零件清单,每个零件都有制造商、成本和利润。我将添加一个片段,但这将是一个由几十家制造商、数百个零件组成的长长的列表 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 我

很抱歉,标题听起来很模糊,但设置如下:

我有一份零件清单,每个零件都有制造商、成本和利润。我将添加一个片段,但这将是一个由几十家制造商、数百个零件组成的长长的列表

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)

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

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

一旦他说了这些,我就能够很快地将这些点连接起来,并实际发现已经存在一个包,可以通过这种精确的设置来解决背包问题:

我需要的答案就在那里。分享此信息,以防其他人需要解决此问题

完整性:

背包问题是一个强盗想要最大限度地提高被盗物品的价格,同时将重量保持在袋容量或低于袋容量的问题。 柔板套装有一个解决这个问题的功能

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(不考虑制造商),并找到一个近似的解决方案。然后,您必须手动查找结果向量中重复的制造商,然后查找一个尽可能低于要替换的项目成本的项目,该项目属于另一个尚未使用的制造商,利润可能最高。请注意,这不一定会产生最佳可用解决方案,即,最优解。问题是NP难的,因此无论如何,它可能不会,但它将是一个很好的近似值。
您计划如何决定选择零件?一种选择是总是先选择最高的利润,然后在平局的情况下选择较低的成本。或者你有不同的想法吗?对,我接下来要做的是,我有一个总成本的固定预算。实际的部分并不重要,我想这部分是我想要它回吐给我的解决方案。我正试图让它给我的独特部分组合将给我的预算下的最大利润。这有助于回答你的问题吗?你真的问了两个问题,每个问题都很难回答。一旦您选择了算法第一部分,那么您需要R代码来执行它第二部分。你可能想选择一个算法,然后用它更新你的问题。我想我想它要做的是创建一个排列,将来自每个唯一制造商的一个零件的所有组合进行排列,然后在总成本低于X值时找到最大利润,然后告诉我产生利润的部分组合是什么。这似乎是背包问题离散优化的一个例子,正如@Tim所说,这远远不是小事。在尝试编写解决方案之前,您可能需要寻找不同的方法和算法来解决此问题。我可以与您联系以帮助澄清有关修改此解决方案的一些问题吗?你是对的,这是一个非常复杂的问题,我需要帮助集中我的想法之前,我试图提出另一个问题的代码帮助。如果答案对你有用,你可以考虑标记与接受的标记标记,只是在下面的投票按钮。