我是R solver的新手,我想在R中有一个简单的例子来解决以下问题:
我有四列,我计算各个总和,如下图所示的示例:
我想在R中解决的问题:
找到满足以下陈述的最佳线条:
我没有使用哪个包解算器的限制。为此提供一个R代码示例可能会有所帮助!
编辑
对于同样的解决方案,我想应用一些规则:
使用在最后的注释中可重复定义的M
,我们发现b
最小化以下b
为0/1向量的目标:
sum((b %*% M - c(0, 0, 5, 5))^2)
1)CVXR使用CVXR包我们得到一个解决方案c(1,0,0,1,1),这意味着选择行1,4和5。
library(CVXR)
b <- Bool(n)
pred <- t(b) %*% M
y <- c(0, 0, 5, 5)
objective <- Minimize(sum((t(y) - pred)^2))
problem <- Problem(objective)
soln <- solve(problem)
bval <- soln$getValue(b)
zapsmall(c(bval))
## [1] 1 0 0 1 1
2)蛮力交替,因为只有5行,所以只有2 ^ 5个可能的解决方案,所以我们可以尝试所有这些并选择最小化目标的那个。首先,我们计算具有2 ^ 5列的矩阵solns
,使得每列是一种可能的解决方案。然后我们计算每列的目标函数,并采用最小化它的目标函数。
n <- nrow(M)
inverse.which <- function(ix, n) replace(integer(n), ix, 1)
L <- lapply(0:n, function(i) apply(combn(n, i), 2, inverse.which, n))
solns <- do.call(cbind, L)
pred <- t(t(solns) %*% M)
obj <- colSums((pred - c(0, 0, 5, 5))^2)
solns[, which.min(obj)]
## [1] 1 0 0 1 1
M <- matrix(c(.38, -.25, .78, .83, -.65,
.24, -.35, .44, -.88, .15,
3, 5, 13, -15, 18,
18, -7, 23, -19, 7), 5)