R решатель оптимизации - PullRequest
       6

R решатель оптимизации

0 голосов
/ 23 ноября 2018

Я новичок в R solver и хочу иметь простой пример в R для решения приведенной ниже проблемы:

У меня есть четыре столбца, в которых я вычисляю отдельные суммы, как показано на примере ниже:

enter image description here

Задача, которую я хочу решить в R:

Найти оптимальные линии, удовлетворяющие одновременно, следующие утверждения:

  1. Для первых двух столбцов (a, b) отдельные суммы должны быть ближе к 0
  2. Суммы (c, d)чтобы быть ближе к 5

У меня нет ограничений на то, какой пакетный решатель использовать.Для этого может быть полезно иметь пример кода R!

РЕДАКТИРОВАТЬ

Для того же решения я хотел бы применить некоторые правила:

  1. Я хочу, чтобы сумма (с)> сумма (d) И сумма (d) <(статическое число, например, 5) </li>
  2. Кроме того, если я хочу, чтобы суммы попадали в диапазон чисел ине просто статические числа, как решение может быть написано?

1 Ответ

0 голосов
/ 23 ноября 2018

Используя 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) BruteСила В качестве альтернативы, поскольку есть только 5 строк, есть только 2 ^ 5 возможных решений, поэтому мы можем попробовать их все и выбрать тот, который минимизирует цель.Сначала мы вычисляем матрицу solns с 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)
...