оптимизация квадратичной функции с ограничениями

Я использую пакет alabama для оптимизации нелинейного ограниченного проблема с оптимизацией.

Проблема в:

 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

Случай 4:

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

person Arc    schedule 22.06.2013    source источник
comment
Не используя alabama, я предполагаю, что вы хотите, чтобы ваша функция ограничения равенства была function(x) { x[1] + x[2] + x[3] + x[4] +x[5] - 2600 }.   -  person Hong Ooi    schedule 22.06.2013
comment
Вы не правильно отредактировали. Определите heq как то, что я ввел выше.   -  person Hong Ooi    schedule 22.06.2013
comment
Сделанный! Ничего не меняет. Имеет ли это?   -  person Arc    schedule 22.06.2013
comment
Шиш. Хорошо, я отредактировал это. Поместите новое определение heq в свой код и посмотрите, работает ли оно.   -  person Hong Ooi    schedule 22.06.2013


Ответы (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])
     }
person Arc    schedule 22.06.2013