Линейная оптимизация R - PullRequest
       6

Линейная оптимизация R

0 голосов
/ 20 сентября 2018

Я новичок в оптимизации, поэтому, пожалуйста, потерпите меня.Вот моя проблема:

A, B, C, D и E - проценты (18%, 2%, 1%, 78%, 1%)

Максимизировать сумму (A (x) + B (x) + C (x) + D (x) + E (x)), т. Е. Максимизировать x (x <= 499572) </p>

, чтобы

  1. A (x) <= 20076 </li>
  2. B (x) <= 8619 </li>
  3. C (x) <= 145 </li>
  4. D (x) <= 465527 </li>
  5. E (x) <= 5205 </li>

Как мне решить эту проблему в R?

Я использовал пакет LPsolve, но я согласен с любыми предложениями.

1 Ответ

0 голосов
/ 20 сентября 2018

Мы повторяем задачу, исключая ограничения положительности для единственной скалярной переменной x, как:

maximize 1 * x
such that
 0.18 * x <= 20076 
 0.02 * x <= 8619 
 0.01 * x <= 145 
 0.78 * x <= 465527 
 0.01 * x <= 5205 

, поэтому в качестве линейной программы мы получаем следующее оптимальное значение x:

library(lpSolve)

constr.mat <- c(.18, .02, .01, .78, .01)
RHS <- c(20076, 8619, 145, 465527, 5205)
soln <- lp("max", 1, constr.mat, "<=", RHS)
soln$solution
## [1] 14500

Конечно, как указано в комментариях ниже, вопрос можно решить тривиально без линейного программирования, взяв наименьшую верхнюю границу x:

min(RHS / constr.mat)
## [1] 14500

Примечание

Если то, что вы на самом деле имели в виду, было не проблемой, изложенной в вопросе, а этой 5-переменной переменной:

max 0.18 * x1 + 0.02 * x2 + 0.01 * x3 + 0.78 * x4 + 0.01 * x5
such that
 0.18 * x1 <= 20076 
 0.02 * x2 <= 8619 
 0.01 * x3 <= 145 
 0.78 * x4 <= 465527 
 0.01 * x5 <= 5205 

, тогда мы имеем

soln2 <- lp("max", constr.mat, diag(constr.mat), "<=", RHS)
soln2$solution
## [1] 111533.3 430950.0  14500.0 596829.5 520500.0

Опять же, это тривиально длявычислить без линейного программирования:

RHS / constr.mat
## [1] 111533.3 430950.0  14500.0 596829.5 520500.0
...