如何在有限制的情况下使用R来解决/挑选适合工作的最佳人选?

如何在有限制的情况下使用R来解决/挑选适合工作的最佳人选?,r,mathematical-optimization,solver,maximize,integer-programming,R,Mathematical Optimization,Solver,Maximize,Integer Programming,我对R相当陌生,我正试图为我过去在Excel中使用Solver所做的事情编写一个脚本。在我下面的数据中,我有一份工作类型为a-E的工人列表。每个工人都有工资和生产率。我想要R做的是找到10名工人累积工资的最大产量使用lpSolve包中的lp,以解决潜在的整数规划问题。前5个限制条件分别是A、B、C、D和E职位的数量,第6个限制条件是可选择的员工数量,第7个限制条件是总工资。假设DF是问题中显示的数据框,尝试以下操作: library(lpSolve) obj <- DF$Prod con

我对R相当陌生,我正试图为我过去在Excel中使用Solver所做的事情编写一个脚本。在我下面的数据中,我有一份工作类型为a-E的工人列表。每个工人都有工资和生产率。我想要R做的是找到10名工人累积工资的最大产量使用lpSolve包中的
lp
,以解决潜在的整数规划问题。前5个限制条件分别是A、B、C、D和E职位的数量,第6个限制条件是可选择的员工数量,第7个限制条件是总工资。假设
DF
是问题中显示的数据框,尝试以下操作:

library(lpSolve)

obj <- DF$Prod
con <- rbind(t(model.matrix(~ Pos + 0, DF)), rep(1, nrow(DF)), DF$Salary)
dir <- c(">=", ">=", ">=", ">=", ">=", "==", "<")
rhs <- c(2, 2, 2, 2, 1, 10, 100000)

result <- lp("max", obj, con, dir, rhs, all.bin = TRUE)
请注意,问题中的Production拼写错误,或者可能是有意的

增加:

关于第二个最佳解决方案,想法是添加一个约束,使最佳解决方案不可行,但不排除其他潜在解决方案:

con2 <- rbind(con, result$solution)
dir2 <- c(dir, "<=")
rhs2 <- c(rhs, 9)
result2 <- lp("max", obj, con2, dir2, rhs2, all.bin = TRUE)

lp
还有一些参数,允许它直接生成多个解决方案;但是,帮助文件提到了一些错误,采用上述方法可能更安全。

是的,至少2个。非常感谢。只是想一想:选择(20,10)=184756,所以在这个小案例中测试每个可能的组合不会花费太长时间。当然,除非这是家庭作业,你必须使用求解器。幸运的是,这不是家庭作业,但完整的列表中有三百多人。我的错误,我应该在原来的帖子中提到。太棒了,非常感谢!作为蛋糕上的锦上添花,有没有办法得到第二个最好的解决方案?问题:我在想一个算法,比如:1)计算一个绩效指标,即生产/工资,2)从每个要求的类别(a-e)中选出最优秀的FOM候选人,3)用最优秀的FOM值填充剩余的位置。这就是
lpSolve
正在做的事情吗?@Derek添加了一个次优解决方案@卡尔,
lp
使用分支定界算法。太棒了!我的最后一个问题是,我们是否可以添加代码来排除特定的人,比如说“Jim”?好像他请了病假,再也没有选择了。我知道我可以从DF中删除他,但是如果我可以在模型中简单地更改它,那就太好了。再次感谢!只需添加一个将Jim变量设置为0的约束。也就是说,将此约束作为.numeric(DF$Name==“Jim”)附加到约束矩阵
,将其附加到方向“==”并将其附加到
rhs
0
> result
Success: the objective function is 84.7 
> DF[result$solution == 1, ]
     Name Pos Salary Producton
2     Jim   A  17753      23.5
3    Jill   A  11447      14.8
4   Brian   A  11447      14.8
6   Nancy   B   4537       2.1
8     Ace   B   2840       1.8
9    Bill   C   3818       1.6
12   Kyle   C   3818       1.6
14 Trevor   D   2000       1.1
15   John   D   4317      11.7
20   Sara   E   4317      11.7
con2 <- rbind(con, result$solution)
dir2 <- c(dir, "<=")
rhs2 <- c(rhs, 9)
result2 <- lp("max", obj, con2, dir2, rhs2, all.bin = TRUE)
> result2
Success: the objective function is 84.7 
> DF[result2$solution == 1, ]
     Name Pos Salary Producton
2     Jim   A  17753      23.5
3    Jill   A  11447      14.8
4   Brian   A  11447      14.8
6   Nancy   B   4537       2.1
8     Ace   B   2840       1.8
9    Bill   C   3818       1.6
12   Kyle   C   3818       1.6
15   John   D   4317      11.7
16 Jerome   D   2000       1.1
20   Sara   E   4317      11.7