在R中,我想根据人们的等级偏好以及他们的绩效来分配项目。假设我有5个项目和3个人。在这种情况下,这三个人都想要A计划,因为这是他们最喜欢的计划,但安娜应该得到,因为她的成绩最好。现在她出局了,詹姆斯和比利都在争夺B计划,而比利应该得到B计划,因为他It“我有一个更好的绩效指标。我怎么能在R中做到这一点呢?我将在现实中有更多的项目和人员。
Project Rank Person Performance
A 1 Billy 95
B 2 Billy 95
C 3 Billy 95
D 4 Billy 95
E 5 Billy 95
A 1 Anna 97
B 2 Anna 97
C 3 Anna 97
D 5 Anna 97
E 4 Anna 97
A 1 James 92
B 2 James 92
C 4 James 92
D 3 James 92
E 5 James 92
6条答案
按热度按时间vngu2lb81#
这是一个
purrr::reduce
的迭代解决方案,这种方法还可以显示每个人选择的项目的排名,例如James选择了排名第三的项目D
。1.按
Performance
和Rank
排列数据,使Performance
高者优先选择项目。1.按
Person
将数据框拆分为列表。Performance
迭代到低:Anna
时,她有最高优先级选择她排名第一的项目A
。Billy
的回合中,他的第一个排名项目A
已经被Anna
选中,所以从他的项目列表中删除那个选项。Billy
原来选择了他的第二个排名项目B
。James
时,他的前两个项目A
和B
已被其他人选中,因此请从他的项目列表中删除这些选项。James
只能选择他的第三个项目D
。piwo6bdm2#
这里有一个
for
循环的方法。首先,根据性能分组(如果几个性能相同,则按人员分组)。第一个应该是性能最好的一个。然后,在一个
for
循环中,迭代地选择具有最低等级的Project,并为其他个体移除该Project。gt0wga4j3#
1.创建独特的向量的人排序他们的表现。
1.按人员拆分项目,并按排名排序。
1.使用
Reduce
,从绩效最高的人员开始,将(剩余的)最高排名的项目分配给每个人员。数据:
基准
结果
在本例中,GKi1是最快的,比第二个IceCreamToucan快大约10倍。Darren Tsai分配的内存量最低。
k97glaaz4#
使用数据.table
yhqotfr85#
上面描述的问题是stable matching problem的一个特例。(至少)有两个R包可以解决这个问题。乍一看,matchingR的文档看起来更容易理解一些,作者声称已经使用它来解决大约30,000个匹配候选项的问题,所以对于这个应用程序来说性能应该是不错的。
还要注意,这些包中使用的算法也将处理工人具有不同项目偏好和/或绩效依赖于项目的一般情况。
rkkpypqq6#
经过一番搜索,
clue::solve_LSAP
似乎可以在这里使用。首先,我们在人员和项目之间建立一个“得分”/“成本”矩阵;这里,我们可以使用一个分数集“performance * rank”(
DF
复制自GKi答案):然后,我们将人员分配到项目中,以使总“成本”最小化: