【问题标题】:Setting Up a Linear Programming Scheduling Problem in R在 R 中设置线性规划调度问题
【发布时间】:2022-01-26 14:56:21
【问题描述】:

我有一个内置在 Excel 中的线性规划调度问题,我想在 R 中重新创建。

我有七个项目要安排在五个时期。示例(非最佳)时间表可能如下所示:

S <- matrix(c(0,0,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0), nrow=5, ncol=7, byrow=TRUE)

> S
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    0    0    1    0    0    0    0
[2,]    0    1    0    0    0    0    1
[3,]    1    0    0    0    0    0    0
[4,]    0    0    0    0    1    0    0
[5,]    0    0    0    1    0    1    0

其中每一列是一个项目,每一行是一个句点。它们必须是已安排或未安排的二元选择。

每个项目/期间选择都带有相关的“奖励”。这些奖励是预定义的,例如:

R <- matrix(c(1.78, .080, .46, 1.85, .18, .13, 2.65, 1.78, .080, .46, 3.15, .16, .13, 2.66, 1.78, .080, .40, 3.15, .16, .13, 2.17, 1.63, .072, .40, 3.06, .16, .12, 2.22, 1.66, .072, .40, 3.34, .16, .13, 2.19), nrow=5, ncol=7, byrow=TRUE)

> R
     [,1]  [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 1.78 0.080 0.46 1.85 0.18 0.13 2.65
[2,] 1.78 0.080 0.46 3.15 0.16 0.13 2.66
[3,] 1.78 0.080 0.40 3.15 0.16 0.13 2.17
[4,] 1.63 0.072 0.40 3.06 0.16 0.12 2.22
[5,] 1.66 0.072 0.40 3.34 0.16 0.13 2.19

因此,在上面的示例[R] 中,如果第一个[,1] 项目安排在第五个周期[5,],它将获得奖励= 1.66。

每个周期项目的奖励是

> R*S
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 0.00 0.00 0.46 0.00 0.00 0.00 0.00
[2,] 0.00 0.08 0.00 0.00 0.00 0.00 2.66
[3,] 1.78 0.00 0.00 0.00 0.00 0.00 0.00
[4,] 0.00 0.00 0.00 0.00 0.16 0.00 0.00
[5,] 0.00 0.00 0.00 3.34 0.00 0.13 0.00

我希望每个项目只安排一次,并且在一个期间内安排的项目不超过两个。我想最大化奖励。即,

max_select <- 2
# 
# maximize reward:
# maximize: sum([R]*[S])
# s.t.
# each item is only selected once:
# sum(S[,j]) = 1
# no more than two items selected per period:
# sum(S[i,]) <= max_select

我在使用 lpSolveAPI 进行设置时遇到了一些困难。

【问题讨论】:

    标签: r optimization linear-programming


    【解决方案1】:

    将目标函数设置为 c(R),将每个行索引 i 的约束设置为 c(row(R) == i),每个列索引 j 设置为 c(col(R) == j)。还将变量设置为二进制。

    library(lpSolveAPI)
    
    nr <- nrow(R)
    nc <- ncol(R)
    L <- make.lp(nr+nc, nr*nc)
    
    set.objfn(L, c(R))
    control <- lp.control(L, sense = "max")
    for(i in 1:nr) add.constraint(L, c(row(R) == i), "<=", 2)
    for(j in 1:nc) add.constraint(L, c(col(R) == j), "=", 1)
    for(k in seq_along(R)) set.type(L, k, type = "binary")
    
    solve(L) # 0 means succeeded
    ## [1] 0
    
    matrix(get.variables(L), nr, nc)
    ##      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
    ## [1,]    0    1    0    0    1    0    0
    ## [2,]    0    0    1    0    0    0    1
    ## [3,]    1    0    0    0    0    1    0
    ## [4,]    0    0    0    0    0    0    0
    ## [5,]    0    0    0    1    0    0    0
    
    get.objective(L)
    ## [1] 8.63
    
    # check that we got a larger objective value than S
    sum(R * S)
    ## [1] 8.61
    

    【讨论】:

    • 谢谢;此答案也与 Excel 答案相匹配。
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2016-01-31
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 2020-02-27
    • 2011-10-06
    • 1970-01-01
    相关资源
    最近更新 更多