6

我对 R 相当陌生,我正在尝试为我过去在 Excel 中使用 Solver 所做的事情编写一个脚本。在下面的数据中,我有一个工作类型为 AE 的工人列表。每个工人都有工资和生产率。我想让 R 做的是找到我可以从 10 名累积工资 <100,000 的工人那里获得的最大产量。限制是我总共需要 10 名工人,我需要 2 名来自工作类型 AD、1 名来自 E 和 1 名任何类型。

我已经搜索并搜索了一种使用 optim、IpSolve 等执行此操作的方法,但由于我的知识有限,我运气不佳。

感谢您的帮助!

Name    Pos Salary  Producton
Joe     A   12001   13.1
Jim     A   17753   23.5
Jill    A   11447   14.8
Brian   A   11447   14.8
Sally   B   2171    1.2
Nancy   B   4537    2.1
Francis B   2840    1.8
Ace     B   2840    1.8
Bill    C   3818    1.6
Ted     C   11447   0.1
Henry   C   2000    1.1
Kyle    C   3818    1.6
Sam     D   11447   0.1
Trevor  D   2000    1.1
John    D   4317    11.7
Jerome  D   2000    1.1
Rebecca E   3818    1.6
Sunny   E   11447   0.1
Britt   E   2000    1.1
Sara    E   4317    11.7
4

1 回答 1

6

在 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)

这使:

> 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

请注意,问题中的 Production 拼写错误,或者可能是故意的。

添加:

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

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

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

于 2013-10-03T15:16:03.393 回答