R解算器优化

时间:2018-11-23 10:39:52

标签: r optimization solver

我是R求解器的新手,我想在R中使用一个简单的示例来解决以下问题:

我有四列,用于计算各个总和,如下所示的示例示例:

enter image description here

我要在R中解决的问题:

同时同时找到以下语句的最佳行:

  1. 对于前两列(a,b),各个总和更接近0
  2. (c,d)之和更接近5

我对使用哪个程序包求解器没有限制。为此提供一个R代码示例可能会很有帮助!

编辑

对于相同的解决方案,我想应用一些规则:

  1. 我想要sum(c)> sum(d)AND sum(d)<(静态数字,例如5)
  2. 此外,如果我希望总和属于一个数字范围而不仅仅是静态数字,那么该解决方案该如何写?

1 个答案:

答案 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}}