2013-06-22 83 views
0

我正在使用alabama package来优化非线性约束优化问题。二次函数的约束优化

的问题是:

minimise: -(0.653*x[1]+ 0.234* x[1]*x[1]+ 0.437 * x[2] + 0.769 * x[3] 
+0.453 * x[4] + 0.744 * x[5] + 0.476 * x[5]* x[5]) 

等式约束是:

x[1]+ x[2]+x[3]+x[4]+x[5] = 2600 

不等式约束是:

x[1]> 900 
x[1] < 1100 
x[2] > 400 
x[2] < 600 
x[3] > 250 
x[3] < 350 
x[4] > 175 
x[4] < 225 
x[5] > 295 
x[5] < 305 

这里就是我想:

fn <- function() { 
    -(0.653*x[1]+ 0.234* x[1]*x[1]+ 0.437 * x[2] + 0.769 * x[3] + 
    0.453 * x[4] + 0.744 * x[5] + 0.476 * x[5]* x[5]) 
} 



heq <- function(x) { x[1] + x[2] + x[3] + x[4] +x[5] - 2600 } 

hin <- function(x) { 
h <- rep(NA, 1) 
h[1] <- x[1] - 900 
h[2] <- 1100 - x[1] 
h[3] <- x[2] - 400 
h[4] <- 600 - x[2] 
h[5] <- x[3] - 250 
h[6] <- 350 - x[3] 
h[7] <- x[4] - 175 
h[8] <- 225 - x[4] 
h[9] <- x[5] - 295 
h[10] <- 305 - x[5] 
h 
} 

这里是我面对面值的不同值的各种问题:

案例1:

ans <- auglag(par= NULL,fn=fn, gr=NULL,hin=hin, heq=heq) 
Error in h[1] <- x[1] - 900 : replacement has length zero 

案例2:

ans <- auglag(par= c(1,1,1,1,1),fn=fn,hin=hin, heq=heq) 
Error in h[1] <- x[1] + x[2] + x[3] + x[4] + x[5] - 2600 : 
    object 'h' not found 

情形3:

ans <- auglag(par= c(1000,500,300,200,300),fn=fn,hin=hin, heq=heq) 
Error in h[1] <- x[1] + x[2] + x[3] + x[4] + x[5] - 2600 : 
    object 'h' not found 

CASE4:

ans <- auglag(par=NULL,fn=fn, gr=NULL,hin=hin,heq=heq) 
Error in h[1] <- x[1] - 900 : replacement has length zero 

什么是应用auglag或constrOptim.nl的正确方法?我试着通过solve.QP来解决这个问题,但是无法解决要传递的参数。

通过@Hong大井所做的编辑后,这里有新的错误:

> ans <- auglag(par= NULL,fn=fn, gr=NULL,hin=hin, heq=heq) 
Error in h[1] <- x[1] - 900 : replacement has length zero 
> ans <- auglag(par= c(1,1,1,1,1),fn=fn,hin=hin, heq=heq) 
Error in fn(par, ...) : unused argument(s) (par) 
> ans <- auglag(par= c(1000,500,300,200,300),fn=fn,hin=hin, heq=heq) 
Error in fn(par, ...) : unused argument(s) (par) 
> ans <- auglag(par=NULL,fn=fn, gr=NULL,hin=hin,heq=heq) 
Error in h[1] <- x[1] - 900 : replacement has length zero 
+0

,而无需使用'alabama',我猜你想你的等式约束函数为'function(x){x [1] + x [2] + x [3] + x [4] + x [5] - 2600}''。 –

+0

正确!编辑它 – Arc

+0

您没有正确编辑它。将'heq'定义为我在上面输入的内容。 –

回答

1

我有这个工作。感谢Hao Ooi引导我一样。

我的问题是:

我所用:

fn <- function() { 
    -(0.653*x[1]+ 0.234* x[1]*x[1]+ 0.437 * x[2] + 0.769 * x[3] + 
    0.453 * x[4] + 0.744 * x[5] + 0.476 * x[5]* x[5]) 
} 

相反,我应该用:

fn <- function(x) { 
     -(0.653*x[1]+ 0.234* x[1]*x[1]+ 0.437 * x[2] + 0.769 * x[3] + 
     0.453 * x[4] + 0.744 * x[5] + 0.476 * x[5]* x[5]) 
    }