我是R求解器的新手,我想在R中使用一个简单的示例来解决以下问题:
我有四列,用于计算各个总和,如下所示的示例示例:
我要在R中解决的问题:
同时同时找到以下语句的最佳行:
我对使用哪个程序包求解器没有限制。为此提供一个R代码示例可能会很有帮助!
编辑
对于相同的解决方案,我想应用一些规则:
答案 0 :(得分:2)
使用注解中可重复定义的b
,我们发现b
最小化了以下目标,其中sum((b %*% M - c(0, 0, 5, 5))^2)
是0/1向量:
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
1)CVXR 使用CVXR程序包,我们得到一个解决方案c(1、0、0、1、1),这意味着选择行1、4和5。
solns
2)蛮力或者,因为只有5行,所以只有2 ^ 5种可能的解决方案,因此我们可以尝试所有解决方案并选择一种将目标最小化的解决方案。首先,我们计算具有2 ^ 5列的矩阵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)
{{1}}