需要从R中的Data Frame中获取满足R中特定目标的记录组合。

问题描述 投票:0回答:2

假设我在R中有一个下面的数据框架,里面有500条球员记录,其列数如下。

  • 玩家ID
  • 总次数
  • 运转率
  • AutionCost

现在在500个玩家中,我希望我的代码能给我3个玩家的多种组合,满足以下条件。类似于一个金钱球的问题。

  • 所有3个玩家的拍卖费用总和不应该超过X。
  • 他们应该至少有Y个总的运行次数。
  • 他们的RunRate必须高于所有玩家的平均RunRate。

请您帮忙解决这个问题。谢谢你的帮助。

r optimization combinations
2个回答
1
投票

所以有 choose(500,3) 选择3名球员的方法,即20,708,500。要生成所有这些组合并非不可能。combn 可能会对你有帮助,但我不能等着去了解。如果你用玩家ID来做,然后测试你的三个条件,这将是解决你问题的一种方法。另一种方法是蒙特卡洛法。选择三个最初满足你条件的玩家。随机选择另一个不属于当前三人组的玩家,如果他满足条件就保存组合并重复。如果你是在优化(虽然不清楚,但你的问题标签里有优化),那么新的玩家必须导致新的三人组比上一个更好,所以如果他没有改善你的目标函数(不管它可能是什么),那么你不接受交易。


1
投票
choose(500,3) 

显示有将近21,000,000个3个玩家的组合从500个池子中抽出,这意味着对整个搜索空间的完整分析应该是在现代机器上的合理时间内可以做到的。

你可以使用iterpc包中的iterpc()和getnext()来生成这些组合的indeces。如

# library(iterpc) # uncomment if not loaded
I <- iterpc(5, 3)
getnext(I)

你也可以通过设置初始过滤条件和或者取第一个解(while loop with condition = meeting criterion),以多种方式大幅削减搜索空间。或者,你可以得到所有的解,并对其进行排序(在所有组合中循环)或者一些中间环节,你可以得到n个解。而预处理可以帮助减少搜索空间。例如,先按升序对工资进行排序,会先得到最便宜的工资解。按运行次数降序排序,会先得到运行次数最高的解。

注意:虽然这样做很好,但我看到iterpc现在已经被安排包所取代,相关的迭代器是icombinations().getnext()仍然是后续迭代器的访问方法。


1
投票

谢谢,我综合使用了John和James的两个答案。

  1. 过滤掉了所有不满足条件的玩家,这样归纳起来只有90多个玩家。
  2. 然后,我用随机抽取球员的方法,直到所有的变化都用完为止。
  3. 最后,我计算了每个变种(集)球员的综合指标,得出优化集。

代码有点乱,不想发在这里。

© www.soinside.com 2019 - 2024. All rights reserved.