使用线性规划进行班次规划
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
---------------------------------------------------
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
---------------------------------------------------