我正在尝试使用 lpSolveAPI 和 R 设置线性编程解决方案来解决调度问题。以下是一小部分数据;每个会话 ID 所需的分钟数,以及它们的“首选”顺序/权重。
id <- 1:100
min <- sample(0:500, 100)
weight <- (1:100)/sum(1:100)
data <- data.frame(id, min, weight)
我想要做的是安排/安排这些会话 ID,以便一天中有最大数量的会话,最好按它们的权重计算,并且每天的上限为 400 分钟。
这就是我目前在 R 中设置它的方式:
require(lpSolveAPI)
#Set up matrix to hold results; each row represents day
r <- 5
c <- 10
row <- 1
results <- matrix(0, nrow = r, ncol = c)
rownames(results) <- format(seq(Sys.Date(), by = "days", length.out = r), "%Y-%m-%d")
for (i in 1:r){
for(j in 1:c){
lp <- make.lp(0, nrow(data))
set.type(lp, 1:nrow(data), "binary")
set.objfn(lp, rep(1, nrow(data)))
lp.control(lp, sense = "max")
add.constraint(lp, data$min, "<=", 400)
set.branch.weights(lp, data$weight)
solve(lp)
a <- get.variables(lp)*data$id
b <- a[a!=0]
tryCatch(results[row, 1:length(b)] <- b, error = function(x) 0)
if(dim(data[!data$id == a,])[1] > 0) {
data <- data[!data$id== a,]
row <- row + 1
}
break
}
}
sum(results > 0)
barplot(results) #View of scheduled IDs
快速查看结果矩阵告诉我,虽然设置可以最大限度地增加会话数,以便一天中的总分钟数尽可能接近 400,但设置并没有遵循给定的权重。我希望我的结果矩阵充满越来越多的会话 ID。
我尝试过分配不同的权重,以相反的顺序分配权重等,但由于某种原因,我的设置似乎没有强制执行“set.branch.weights”。
我已经阅读了“set.branch.weights”的文档,lpSolveAPI
但我认为我在这里做错了。
示例 - 数据:
id min weight
1 67 1
2 72 2
3 36 3
4 91 4
5 80 5
6 44 6
7 76 7
8 58 8
9 84 9
10 96 10
11 21 11
12 1 12
13 41 13
14 66 14
15 89 15
16 62 16
17 11 17
18 42 18
19 68 19
20 25 20
21 44 21
22 90 22
23 4 23
24 33 24
25 31 25
应该
Day 1 67 72 36 91 80 44 76
Day 2 58 84 96 21 1 41 66 89
Day 3 62 11 42 68 25 44 90 4 33 31
每天的累计总和为 <= 480m。