В R есть несколько пакетов, которые можно использовать для этого. См. Представление задачи оптимизации в CRAN: https://cran.r -project.org / web / views / Optimization.html
Вот две возможности.
1) CVXR Мы можем использовать CVXR для выпуклой оптимизации.
library(CVXR)
x_start <- c(4,3,7)
tot <- 16
x <- Variable(3)
objective <- Minimize(sum((x - x_start)^2))
constraints <- list(sum(x) == tot, x >= 0, x <= 6)
problem <- Problem(objective, constraints)
soln <- solve(problem)
xval <- soln$getValue(x)
xval
## [,1]
## [1,] 5.500036
## [2,] 4.499964
## [3,] 6.000000
soln$value
## [1] 5.5
soln$status
## [1] "optimal"
2) limSolve Еще один пакет, который может это сделать, это limSolve. Это решает проблему минимизации || Ax-B || ^ 2 над вектором x с учетом Ex = F и Gx> = H.
library(limSolve)
lsei(A = diag(3), B = x_start,
E = rep(1, 3), F = tot,
G = rbind(diag(3), -diag(3)), H = c(0, 0, 0, -6, -6, -6))
, давая:
$X
[1] 5.5 4.5 6.0
$residualNorm
[1] 7.105427e-15
$solutionNorm
[1] 5.5
$IsError
[1] FALSE
$type
[1] "lsei"