R求解器优化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R求解器优化相关的知识,希望对你有一定的参考价值。

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

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

enter image description here

我想在R中解决的问题:

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

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

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

编辑

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

  1. 我希望总和(c)>总和(d)和总和(d)<(静态数,如5)
  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)

以上是关于R求解器优化的主要内容,如果未能解决你的问题,请参考以下文章

优化工具包—无约束非线性优化求解器(fminsearch)

优化片段着色器

优化求解平衡优化器算法matlab源码

单目标优化求解基于matlab增强型黑猩猩优化器算法求解单目标优化问题含Matlab源码 2013期

优化求解水母搜索优化器JS算法matlab源码

运筹系列43:优化求解器HiGHS介绍