我有一个房间列表,房间的最大平方英尺,程序,程序的最大平方英尺,以及房间匹配(匹配#)预期程序使用的值。在帮助下,我能够最大限度地利用每个房间一个程序的匹配 # 和平方英尺。但是,我想将这一分析更进一步,并允许同一房间内的多个节目或同一节目的倍数,如果它具有最高匹配#,只要倍数仍然符合平方英尺要求。此外,我想总体上告诉 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 个封闭式办公室,这些办公室的最佳匹配得分远高于 1 个协作空间(8 个匹配)和 1 个存储/档案(4 个匹配),总共 12 个匹配。
因此这引出了我的下一个问题,即限制我的解决方案矩阵中某些程序的总数。我想它会包括某种
as.numeric(data$EnclosedOffices "<=" 5)
但我也不知道如何限制它。这些数字对于所有程序都是不同的。
感谢您提供任何和所有帮助,并随时要求任何澄清。
更新: 约束
- 最大化每个房间的匹配 # (obj.vals)。
- 最大化每个 room.size 平方英尺内的 program.size 平方英尺。通过多次使用相同的程序(5 个封闭办公室)或组合程序(1 个协作空间和 1 个表演)来做到这一点。
- 限制和/或强制解决方案中返回的程序数量。只要不超过我在所有房间中为该程序提供的最大数量,这些程序就可以在房间之间进行拆分。(在所有 28 列中只能选择 5 个封闭式办公室、8 个工作室/教室、1 个制造等。