例如,我有这个示例数据:
d=data.frame(x=c(1,1,1,2,2,3,4,4),y=c(5,6,7,8,7,5,6,5),w=c(1,2,3,4,5,6,7,8))
看起来像这样:
x y w
1 1 5 1
2 1 6 2
3 1 7 3
4 2 8 4
5 2 7 5
6 3 5 6
7 4 6 7
8 4 5 8
x
和 y
表示来自 datax
和 datay
的索引 . w
表示将 datax[x]
与 datay[y]
进行比较得分 . 我希望从 d
最大化总得分(或 w
),其中 x
的每个值最多匹配一个 y
值,反之亦然 .
结果应如下所示:
x y w
1 2 7 5
2 3 5 6
3 4 6 7
其中所有 w
值的总和最大化,并且每个 x
和每个 y
在结果中仅显示一次 .
如何在 lpSolve::lp
函数中设置此问题?
1 回答
您可以使用lpSolveAPI来解决您的问题 . 鉴于您的约束,您声明的解决方案并不可行 . 所以,让我们一起想要让X和Y在解决方案中不再重复 .
您将需要8个新的二进制变量 . 每个变量指定
d
中的该行是被拾取(1)还是被丢弃(0) .根据OP的请求更新
是的,lpSolveAPI代码(下面)使它看起来比实际上更复杂 . 这个LP公式(lpSolveAPI的输出)应该让事情更清晰:
说明:第二个约束(OneX_2)仅表示
pick_4
或pick_5
中只有一个可以为1,因为数据框d
中的第4行和第5行具有X = 2解决方案
请注意,上面的公式产生了一个在数据框中选择4行的最佳解决方案
d
w的总和是20,这比问题中的解决方案更好 .
代码
希望这能让您了解如何使用lpSolveAPI来制定您的问题 .