如何在有限制的情况下使用R来解决/挑选适合工作的最佳人选?
我对R相当陌生,我正试图为我过去在Excel中使用Solver所做的事情编写一个脚本。在我下面的数据中,我有一份工作类型为a-E的工人列表。每个工人都有工资和生产率。我想要R做的是找到10名工人累积工资的最大产量使用lpSolve包中的如何在有限制的情况下使用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
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