2015-03-08 3 views
2

Я хотел бы дополнительно ограничивать систему ниже со следующим дополнительным ограничением, что делает использование абсолютного оператора значения:Абсолютные ограничения значений в lpSolve в R

abs(x1)+abs(x2)+abs(x3) <= 10 

Существует ли реальный способ реализовать эти дополнительные ограничения абсолютного значения в R?

Система уравнений:

maximize: x1 + 9x2 + x3; 

subject to: 

x1 + 2x2 + 3x3 <= 9 

3x1 + 2x2 + 2x3 <= 15 

R Код:

require(lpSolve) 
# objective function, constants, constraints 
obj = c(1,9,1) 
con = matrix(c(1,2,3,3,2,2), nrow=2, byrow=TRUE) 
rel = c("<=", "<=") 
rhs = c(9,15) 

Решение:

my.lp = lp("max", obj, con, rel, rhs) 
my.lp$objval 
my.lp$solution 

Очевидно, что это простой пример, чтобы проиллюстрировать эту проблему, я вытащил после поиска в Интернете. Кажется, что есть подход в lp_solve, о чем свидетельствует here в справочной системе lp_solve. Тем не менее, я предпочел бы сохранить проблему в R, если это возможно.

ответ

3

К модели |x| в LP вы обычно создаете две новые переменные, x^- и x^+. Ограничить их оба неотрицательные:

x^-, x^+ >= 0 

Тогда каждый раз, когда у вас есть x в вашей модели, замените его x^+ - x^-, и каждый раз, когда у вас есть |x|, замените его x^+ + x^-. Обратите внимание, что это работает только в том случае, если вы используете решатель LP на основе симплексов, а не метод внутренней точки. lp_solve использует симплекс.

Причина, по которой это работает: Предположим, что x = 10 в оптимальном решении. Тогда решатель установит x^+ = 10 и x^- = 0 получить

x = x^+ - x^- = 10 
|x| = x^+ + x^+ = 10. 

И если x = -10 в оптимальном решении, то x^+ = 0, x^- = 10 и

x = x^+ - x^- = -10 
|x| = x^+ + x^+ = 10. 

(Решатель не будет выбирать, скажем, x^+ = 50 и x^- = 40, чтобы получить x = 10, потому что метод симплекс всегда выбирает решения с экстремальными точками.)

Если вы делаете этот трюк отдельно с каждым из трех abs в своей модели, он должен работать.

+0

Спасибо! Реализация все еще немного нечеткая для меня, но я должен это понять. Если у вас есть примеры кода, из которых вы это сделали, это будет оценено по достоинству. Еще раз спасибо. – jd8585

+2

Я не ... Я не пользователь R. Удачи! – grendelsdad

 Смежные вопросы

  • Нет связанных вопросов^_^