2012-12-20 223 views
2

我一直在嘗試解決R中使用constrOptim()(我的第一次)的約束優化問題,但我正在努力爲我的問題設置約束。約束優化R建立約束

的問題是非常簡單的,我可以設置功能確定,但​​在大約經過約束損失感到有點。

例如我已經定義的問題是(我打算以N固定在1000開始說,所以我只想解決X最終我想選擇N和X的最大利潤):

所以我可以設置功能爲:

fun <- function(x, N, a, c, s) { ## a profit function 
    x1 <- x[1] 
    x2 <- x[2] 
    x3 <- x[3]  
    a1 <- a[1] 
    a2 <- a[2] 
    a3 <- a[3] 
    c1 <- c[1] 
    c2 <- c[2] 
    c3 <- c[3] 
    s1 <- s[1] 
    s2 <- s[2] 
    s3 <- s[3] 
    ((N*x1*a1*s1)-(N*x1*c1))+((N*x2*a2*s2)-(N*x2*c2))+((N*x3*a3*s3)-(N*x3*c3)) 
} 

我需要實現的約束是:

x1>=0.03 
x1<=0.7 
x2>=0.03 
x2<=0.7 
x3>=0.03 
x2<=0.7 
x1+x2+x3=1 

的X這裏表示成我需要最優地分配N個區段,所以N個X1 = pecent放置在桶1等,每個桶具有至少3%但不超過70%。

非常感謝任何幫助...

例如,這裏是我用來測試功能的一個例子,我想要什麼:

fun <- function(x, N, a, c, s) { ## profit function 
     x1 <- x[1] 
     x2 <- x[2] 
     x3 <- x[3]  
     a1 <- a[1] 
     a2 <- a[2] 
     a3 <- a[3] 
     c1 <- c[1] 
     c2 <- c[2] 
     c3 <- c[3] 
     s1 <- s[1] 
     s2 <- s[2] 
     s3 <- s[3] 
     ((N*x1*a1*s1)-(N*x1*c1))+((N*x2*a2*s2)-(N*x2*c2))+((N*x3*a3*s3)-(N*x3*c3)) 
    }; 

    x <-matrix(c(0.5,0.25,0.25)); 

    a <-matrix(c(0.2,0.15,0.1)); 

    s <-matrix(c(100,75,50)); 

    c <-matrix(c(10,8,7)); 

    N <- 1000; 

fun(x,N,a,c,s); 
+0

所以...'X [1:3],'是變量,而一個'[1:3]','S [1:3]'和'C [1:3]'中給出值?你能否詳細說明你需要的配方?我不清楚... – digEmAll

+0

是的 - a [1:3],s [1:3],c [1:3]代表歷史平均激活率,支出,購置成本..我試圖選擇x [1:3]來最大限度地發揮 – andrewm4894

回答

2

您可以使用lpSolveAPI包。

## problem constants 
a <- c(0.2, 0.15, 0.1) 
s <- c(100, 75, 50) 
c <- c(10, 8, 7) 
N <- 1000 


## Problem formulation 
# x1   >= 0.03 
# x1   <= 0.7 
#  x2  >= 0.03 
#  x2  <= 0.7 
#   x3 >= 0.03 
# x1 +x2 + x3 = 1 
#N*(c1- a1*s1)* x1 + (a2*s2 - c2)* x2 + (a3*s3- c3)* x3 

library(lpSolveAPI) 
my.lp <- make.lp(6, 3) 

打造LP模型解決的最好辦法是縱列;

#constraints by columns 
set.column(my.lp, 1, c(1, 1, 0, 0, 1, 1)) 
set.column(my.lp, 2, c(0, 0, 1, 1, 0, 1)) 
set.column(my.lp, 3, c(0, 0, 0, 0, 1, 1)) 
#the objective function ,since we need to max I set negtive max(f) = -min(f) 
set.objfn (my.lp, -N*c(c[1]- a[1]*s[1], a[2]*s[2] - c[2],a[3]*s[3]- c[3])) 
set.rhs(my.lp, c(rep(c(0.03,0.7),2),0.03,1)) 
#constraint types 
set.constr.type(my.lp, c(rep(c(">=","<="), 2),">=","=")) 

看看我的模型

my.lp 
Model name: 

Model name: 
      C1  C2  C3   
Minimize 10000 -3250 2000   
R1   1  0  0 >= 0.03 
R2   1  0  0 <= 0.7 
R3   0  1  0 >= 0.03 
R4   0  1  0 <= 0.7 
R5   1  0  1 >= 0.03 
R6   1  1  1 =  1 
Kind  Std Std Std   
Type  Real Real Real   
Upper  Inf Inf Inf   
Lower   0  0  0  
solve(my.lp) 

[1] 0 ## sucess :) 

get.objective(my.lp) 
[1] -1435 
get.constraints(my.lp) 
[1] 0.70 0.70 0.03 0.03 0.97 1.00 
## the decisions variables 
get.variables(my.lp) 
[1] 0.03 0.70 0.27 
+0

的功能,非常感謝,請看看我能否弄明白。你給出的規範中缺少N(例如,我剛剛有N = 1000,開始簡單)。在我運行解決(my.lp)之後,我怎樣才能找到x [1:3]的最佳值...??非常感謝 – andrewm4894

+0

@ user1919374是的N丟失,但你可以添加它。但更重要的是看你是否對決策變量的類型有所限制?是全部整數,例如二進制? – agstudy

+0

全部整數..... – andrewm4894

1

嗨只是在使用任何人的情況下,我也找到了答案如下:

首先,你的目標函數可以寫成更簡潔地使用矢量操作:

> my_obj_coeffs <- function(N,a,c,s) N*(a*s-c) 


> fun <- function(x,N,a,c,s) sum(my_obj_coeffs(N,a,c,s) * x) 

你正在嘗試解決一個線性程序,所以你可以使用simplex算法來解決它。 'boot'包中有一個輕量級的實現。

> library(boot) 

> solution <- function(obj) simplex(obj, diag(3), rep(0.7,3), diag(3), rep(0.03,3), rep(1,3), 1, maxi=TRUE) 

Then for the example parameters you used, you can call that solution function: 

> a <- c(0.2,0.15,0.1) 
> s <- c(100,75,50) 
> c <- c(10,8,7) 
> N <- 1000 
> solution(my_obj_coeffs(N,a,c,s)) 

Linear Programming Results 

Call : simplex(a = obj(N, a, s, c), A1 = diag(3), b1 = rep(0.7, 3), 
    A2 = diag(3), b2 = rep(0.03, 3), A3 = matrix(1, 1, 3), b3 = 1, 
    maxi = TRUE) 

Maximization Problem with Objective Function Coefficients 
     [,1] 
[1,] 10000 
[2,] 3250 
[3,] -2000 
attr(,"names") 
[1] "x1" "x2" "x3" 


Optimal solution has the following values 
    x1 x2 x3 
0.70 0.27 0.03 
The optimal value of the objective function is 7817.5. 
+0

我也應該說這個問題,因爲我已經制定了它總是有一個簡單的解決方案,是儘可能分成受限制的'最佳'桶 - 事後很明顯,這是很明顯的! – andrewm4894