R函数可找到数据帧中对象的最佳排名?

时间:2019-06-04 16:23:21

标签: r permutation mathematical-optimization combinatorics

我正在尝试找到数量为 n 的产品列表的最佳顺序,以实现收益最大化。

示例:

Product    Position 1    Position 2    Position 3
X $0.38 $0.17 $0.11
Y $1.08 $0.71 $0.52
Z $0.82 $0.41 $0.26

一个产品(X,Y,Z)只能列出一次,每个位置(1,2,3)也只能列出一次。对于此示例,有6种可能的解决方案(n = 3,r = 3,3!/(3!-3!)= 6),但这应该能够应用于 n < / em>产品排在 r

X1 + Y2 + Z3 = $1.35
X1 + Z2 + Y3 = $1.31
Y1 + X2 + Z3 = $1.51
Y1 + Z2 + X3 = $1.60
Z1 + X2 + Y3 = $1.51
Z1 + Y2 + X3 = $1.64

将选择最终组合(Z1 + Y2 + X3),因为$ 1.64可提供最大的收入。除了找到最佳收入数字之外,我还需要知道选择的有序组合,以便知道哪些产品属于哪个位置。

我尝试了诸如combin和expand.grid之类的功能,但这些功能似乎将所有元素组合在一个向量中,而我只能在一个位置上存在一个乘积。

R是解决此问题的可行工具吗?我需要以其他格式构造数据吗?

1 个答案:

答案 0 :(得分:1)

根据“ ,但该解决方案应该能够应用于排名在N个位置的N个产品”,我们知道number of products = number of spots = N。这本质上是一个分配问题

数学模型通常表示为:

 min sum((i,j), c[i,j]*x[i,j])
 subject to
     sum(i, x[i,j]) = 1   for all locations j
     sum(j, x[i,j]) = 1   for all products i
     x[i,j] in {0,1}

这可以使用LP求解器或专用求解器进行求解。有关某些(有限的)性能指标,请参见link。我认为开发自己的算法来找到最佳解决方案并很快地做到这一点并不容易。

PS海报中删除了句子“ 但是该解决方案应该能够应用于排在N个位置的N个产品”,这有点不幸。因此,问题有所改变。随着问题的变化,可能需要更新模型。现在,我们有了一个不平衡的分配问题,而不是一个平衡的分配问题。根据产品数量(N)小于还是大于位置(M)的数量,我们需要对模型进行一些更改。仍然可以将其表示为LP / MIP,也可以通过添加虚拟源或目标节点将其引入分配问题。