Квадратичная программа с a_ix_i^2 членами в целевой функции

Что касается квадратичной программы, как бы я установить целевую функцию, такую ​​как

min⁡ ∑a_i (x_i)^2

в матричной форме для пакетов "quadprog" или "limSolve" (для этого пакета я не уверен, должен ли он быть в матричной форме)?

Из обсуждения, которое я видел до сих пор, не было умножения квадратичного члена.

1 ответ

Давайте рассмотрим простую линейно ограниченную квадратичную программу в форме, которую вы упомянули:

min  0.5x^2 + 0.7y^2
s.t. x + y = 1
     x >= 0
     y >= 0

Решение с quadprog пакет

quadprog Пакет принимает модели следующей формы:

min −d'b + 1/2b'Db
s.t. A'b >= b0

Чтобы получить нашу проблему в этой форме, нам нужно построить матрицу D с (2*0.5 2*0.7) в качестве основной диагонали, а также матрицы A с нашими тремя ограничениями и правой стороны b0:

dvec <- c(0, 0)
Dmat <- diag(c(1.0, 1.4))
Amat <- rbind(c(1, 1), c(1, 0), c(0, 1))
bvec <- c(1, 0, 0)
meq <- 1  # The first constraint is an equality constraint

Теперь мы можем кормить это solve.QP:

library(quadprog)
solve.QP(Dmat, dvec, t(Amat), bvec, meq=meq)$solution
# [1] 0.5833333 0.4166667

Решение с limSolve пакет

limSolve пакет-х lsei Функция принимает модели следующего вида:

min  ||Ax-b||^2
s.t. Ex = f
     Gx >= h

Для получения нашей целевой функции нам нужно построить матрицу A с (sqrt(0.5) sqrt(0.7)) в качестве основной диагонали установите b быть вектором 0, а также матрицами и векторами, кодирующими другую информацию:

A <- diag(c(sqrt(0.5), sqrt(0.7)))
b <- c(0, 0)
E <- rbind(c(1, 1))
f <- 1
G <- diag(2)
h <- c(0, 0)

Теперь мы можем кормить эту информацию lsei:

library(limSolve)
lsei(A, b, E, f, G, h)$X
# [1] 0.5833333 0.4166667
Другие вопросы по тегам