2015-03-08 57 views
2

我想進一步約束之下具有以下附加約束,這使得使用絕對值運營商的系統:絕對值限制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就是證明。但是,如果可能,我寧願將問題保留在R中。

回答

3

要在LP中建模|x|,通常需要創建兩個新變量,x^-x^+。約束它們都爲負,:

x^-, x^+ >= 0 

然後每次在模型中有x時間,與x^+ - x^-取代它,並在每次有|x|時間,用x^+ + x^-更換。請注意,這僅適用於使用基於Simplex的LP解算器而不是內點法的情況。 lp_solve使用單工。

這樣做的原因:假設x = 10在最佳解決方案。然後求解器將設置x^+ = 10x^- = 0獲得

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

如果在最優解x = -10,然後x^+ = 0x^- = 10

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

(解算器不會選擇,比方說, x^+ = 50x^- = 40得到x = 10,因爲單純形法總是選擇極點解。)

如果你在模型中分別使用三個abs這個技巧,它應該可以工作。

+0

謝謝!對我來說,實現仍然有點模糊,但我應該弄明白。如果你有任何你已經實現的代碼示例,那將不勝感激。再次感謝。 – jd8585 2015-03-09 01:57:14

+2

我不 - 我不是R用戶。祝你好運! – grendelsdad 2015-03-09 17:30:21