使用线性规划进行班次规划

时间:2017-04-01 05:16:14

标签: r linear-programming operations-research

Modeling and Solving Linear Programming with R书在第3.7节中有一个关于规划转变的很好的例子。我无法用R解决它。另外,我不清楚书中提供的解决方案。

问题

一家公司有一个紧急中心,每天24小时工作。在 下表详细列出了每个员工的最低需求 这一天分为六个小时,四个小时。

     Shift    Employees
00:00 - 04:00    5
04:00 - 08:00    7
08:00 - 12:00   18
12:00 - 16:00   12
16:00 - 20:00   15
20:00 - 00:00   10

R解决方案

我使用以下内容来解决上述问题。

library(lpSolve)
obj.fun <- c(1,1,1,1,1,1)
constr <- c(1,1,0,0,0,0,
            0,1,1,0,0,0,
            0,0,1,1,0,0,
            0,0,0,1,1,0,
            0,0,0,0,1,1,
            1,0,0,0,0,1)
constr.dir <- rep(">=",6)
constr.val <-c (12,25,30,27,25,15)
day.shift <- lp("min",obj.fun,constr,constr.dir,constr.val,compute.sens = TRUE)

而且,我得到以下结果。

> day.shift$objval
[1] 1.666667
> day.shift$solution
[1] 0.000000 1.666667 0.000000 0.000000 0.000000 0.000000

这与书中提到的数值解决方案无关。

数值解

根据数值解法所需的解决方案总数为38。但是,由于问题表明,每个时期都有明确的最低雇员人数,这个解决方案如何有效?

s1 5 s2 6 s3 12 s4 0 s5 15 s6 0

1 个答案:

答案 0 :(得分:3)

您的错误是在初始化变量constr时,因为您没有将其定义为矩阵。第二个错误是你的矩阵本身。看看我的例子。

我想知道为什么你不坚持书中的例子,因为我想检查我的解决方案。我的基础是。

library(lpSolve)
obj.fun <- c(1,1,1,1,1,1)
constr <- matrix(c(1,0,0,0,0,1,
        1,1,0,0,0,0,
        0,1,1,0,0,0,
        0,0,1,1,0,0,
        0,0,0,1,1,0,
        0,0,0,0,1,1), ncol = 6, byrow = TRUE)
constr.dir <- rep(">=",6)
constr.val <-c (5,7,18,12,15,10)
day.shift <- lp("min",obj.fun,constr,constr.dir,constr.val,compute.sens = TRUE)

day.shift$objval
# [1] 38
day.shift$solution
# [1]  5 11  7  5 10  0

根据评论中的问题进行编辑:

这是期间变化的分布:

shift | 0-4 | 4-8 | 8-12 | 12-16 | 16-20 | 20-24
---------------------------------------------------
20-4  | 5   | 5   |      |       |       |
0-8   |     | 11  | 11   |       |       |
4-12  |     |     | 7    | 7     |       |
8-16  |     |     |      | 5     | 5     |
12-20 |     |     |      |       | 10    | 10
18-24 |     |     |      |       |       |
----------------------------------------------------
sum   | 5   | 16  | 18   | 12    | 15    | 10
----------------------------------------------------
need  | 5   | 7   | 18   | 12    | 15    | 10
---------------------------------------------------