R求解器优化

问题描述 投票:0回答:1

我是R solver的新手,我想在R中有一个简单的例子来解决以下问题:

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

enter image description here

我想在R中解决的问题:

找到满足以下陈述的最佳线条:

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

我没有使用哪个包解算器的限制。为此提供一个R代码示例可能会有所帮助!

编辑

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

  1. 我希望总和(c)>总和(d)和总和(d)<(静态数,如5)
  2. 另外,如果我希望总和落入一系列数字而不仅仅是静态数字,那么解决方案是如何编写的?
r optimization solver
1个回答
2
投票

使用在最后的注释中可重复定义的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)
© www.soinside.com 2019 - 2024. All rights reserved.