スケジューリングの問題を解決するために、lpSolveAPI と R を使用して線形計画法ソリューションをセットアップしようとしています。以下は、データの小さなサンプルです。各セッション ID に必要な分数と、それらの「優先」順序/重み。
id <- 1:100
min <- sample(0:500, 100)
weight <- (1:100)/sum(1:100)
data <- data.frame(id, min, weight)
私がやりたいことは、これらのセッション ID を調整/スケジュールして、1 日に最大数のセッションがあり、できればその重みで、1 日が合計 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
結果のマトリックスをざっと見てみると、セットアップはセッション数を最大化して 1 日の合計時間が 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 です。