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

Shift planning with Linear Programming

Modeling and Solving Linear Programming with R 书在第 3.7 节中有一个很好的计划班次示例。我无法用R解决。另外,我对书中提供的解决方案也不清楚。

问题

某公司有一个24小时不间断工作的急救中心。在 下面的 table 详细说明了员工对每个 一天分为四小时六班。

     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

你的错误在于你初始化变量 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
---------------------------------------------------