部屋のリスト、部屋の最大平方フィート、プログラム、プログラムの最大平方フィート、および部屋が意図したプログラムの使用にどれだけ一致するか (一致数) の値があります。助けを借りて、部屋ごとに 1 つのプログラムのマッチ数と平方フィートの使用を最大化することができました。ただし、この分析をさらに一歩進めて、同じ部屋で複数のプログラムを許可したいと思います。一致数が最も高い場合は、倍数が平方フィートの要件内に収まる限り、同じプログラムの倍数を許可します。さらに、lpSolve全体に、建物全体で「x」個のオフィス、「y」個のスタジオなどのみが必要であることを伝えたいと思います。これまでのデータとコードは次のとおりです。
program.size <- c(120,320,300,800,500,1000,500,1000,1500,400,1500,2000)
room.size <- c(1414,682,1484,2938,1985,1493,427,1958,708,581,1485,652,727,2556,1634,187,2174,205,1070,2165,1680,1449,1441,2289,986,298,590,2925)
(obj.vals <- matrix(c(3,4,2,8,3,7,4,8,6,4,7,7,
3,4,2,8,3,7,4,8,6,4,7,7,
4,5,3,7,4,6,5,7,5,3,6,6,
2,3,1,7,2,6,3,7,7,5,6,6,
4,5,3,7,4,6,5,7,5,3,6,6,
3,6,4,8,5,7,4,8,7,7,7,7,
3,4,2,8,3,7,4,8,6,4,7,7,
4,5,3,7,4,6,5,7,5,3,6,6,
6,7,5,7,6,6,7,7,5,3,6,6,
6,7,5,7,6,6,7,7,5,3,6,6,
5,6,6,6,5,7,8,6,4,2,5,5,
6,7,5,7,6,6,7,7,5,3,6,6,
6,7,5,7,6,6,7,7,5,3,6,6,
3,4,4,8,3,9,6,8,6,4,7,7,
3,4,2,6,3,5,4,6,6,4,5,5,
4,5,3,5,4,4,5,5,5,3,4,4,
5,6,4,8,5,7,6,8,6,4,7,7,
5,6,4,8,5,7,6,8,6,4,7,7,
4,5,5,7,4,8,7,7,5,3,6,6,
5,6,4,8,5,7,6,8,6,4,7,7,
3,4,2,6,3,5,4,6,6,4,5,5,
5,6,4,8,5,7,6,8,6,4,7,7,
5,6,4,8,5,7,6,8,6,4,7,7,
5,4,4,6,5,5,6,6,6,6,7,5,
6,5,5,5,6,4,5,5,5,7,6,4,
4,5,3,7,4,6,5,7,7,5,6,6,
6,5,5,5,6,4,5,5,5,7,6,4,
3,4,4,6,3,7,6,6,6,4,5,5), nrow=12))
rownames(obj.vals) <- c("Enclosed Offices", "Open Office", "Reception / Greeter", "Studio / Classroom",
"Conference / Meeting Room", "Gallery", "Public / Lobby / Waiting",
"Collaborative Space", "Mechanical / Support", "Storage / Archives",
"Fabrication", "Performance")
(obj.adj <- obj.vals * outer(program.size, room.size, "<="))
nr <- nrow(obj.adj)
nc <- ncol(obj.adj)
library(lpSolve)
obj <- as.vector(obj.adj)
con <- t(1*sapply(1:nc, function(x) rep(1:nc == x, each=nr)))
dir <- rep("<=", nc)
rhs <- rep(1, nc)
mod <- lp("max", obj, con, dir, rhs, all.bin=TRUE)
final <- matrix(mod$solution, nrow=nr)
さて、私の質問は、ソルバーが平方フィートの使用を最大化し、各部屋 (列) 内で # を一致させ、同じプログラムの複数またはプログラムの組み合わせでこれを達成できるようにするにはどうすればよいかということです。「mod」の「<= 1」の制限を解除する必要があることはわかっていますが、各部屋で、そして最終的には全体で最適なものを見つける方法がわかりません。
部屋 [,1] の解決策は次のとおりです。
$optimum
33
そして、部屋内に 11 の密閉型オフィスを配置しようとします。これは、合計 12 の一致に対して、1 つの共同スペース (8 一致) および 1 つのストレージ/アーカイブ (4 一致) よりもはるかに高い最適一致 # を獲得します。
これは、ソリューション マトリックス内の特定のプログラムの総数を制限するという次の質問につながります。私はそれが何らかの種類を含むと仮定します
as.numeric(data$EnclosedOffices "<=" 5)
しかし、それを制限する方法もわかりません。これらの数値は、すべてのプログラムで異なります。
ご協力いただきありがとうございます。不明な点がございましたら、お気軽にお問い合わせください。
更新: 制約
- 各部屋の一致数 (obj.vals) を最大化します。
- プログラムを最大化します。各部屋のサイズは平方フィートです。サイズは平方フィートです。これを行うには、同じプログラムを複数回使用するか (5 x 密閉型オフィス)、またはプログラムを組み合わせます (1 つのコラボレーティブ スペースと 1 つのパフォーマンス)。
- ソリューションで返されるプログラムの数を制限または強制します。プログラムは、すべての部屋でそのプログラムに提供する最大数を超えない限り、部屋間で分割できます。(全 28 列で選択できるのは、5 つの閉鎖されたオフィス、8 つのスタジオ/教室、1 つのファブリケーションなどのみです。