2013-06-22 4 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 
} 

Вот различные проблемы, с которыми я сталкиваюсь с различными значениями пар:

case1:

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 Ooi, вот новые ошибки:

> 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

Я получил эту работу. Спасибо Хао Оой за то, что он руководил мной.

Моя проблема заключалась в том, что:

я использовал:

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]) 
    }