1

使用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

解决方案

我使用以下方法解决了上述问题。

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

4

1 回答 1

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
---------------------------------------------------
于 2017-04-01T07:06:58.900 回答