2016-05-08 3 views
1

Возможно ли оптимизировать функцию с использованием optim(par = init) с ограничением, что вектор параметров всегда в порядке возрастания? Например, c(1,2,8) будет разрешено, но c(1,2,0) не разрешено?Ограничить ряды параметров оптимизированным

+2

Это линейные ограничения, которые могут быть обработаны в 'constrOptim()'. См. Также CRAN TaskView https://cran.r-project.org/web/views/Optimization.html – jogo

+0

@jogo Отличный совет, спасибо! – Hatshepsut

ответ

2

Вы можете использовать constrOptim(), который может обрабатывать линейные ограничения:

constrOptim(theta=c(..), f=.., grad=NULL, 
    ui=matrix(c(-1,1,0, 0,-1,1), 2, byrow=TRUE), ci=c(0, 0)) 
+0

Существуют ли опасности использования Nelder-Mead, подразумеваемых 'grad = NULL', а не использования' BFGS' в 'optim', как это было бы возможно для ответа Otto_K? Кажется, что я не могу использовать BFGS без вычисления градиента с помощью 'constrOptim', но я могу под чистым' optim'. – Hatshepsut

+0

Я полагаю, что опасность меньше, чем в ответе Отто_К (манипуляции целевой функцией с разрывом). BFGS - это метод построения прокси-сервера для гессиана из градиентов шаг за шагом. Градиент может быть аппроксимирован на конечные разности. – jogo

0

Вы должны включить это условие в функции оптимизации:

Если ваша функция, чтобы максимизировать это:

fn<-function(x,y,z){ 

    -x^2-(1+y)^2-(z-y)^2 

} 

Вам нужно изменить его на:

fn<-function(x,y,z){ 
    if(x<y&&y<z){ 
     return(-x^2-(1+y)^2-(z-y)^2) 
    } 
    else{ 
     return(-Inf) 
    } 

} 

Теперь вы можете оптимизируйте эту функцию.

+0

Это больше не является непрерывным и дифференцируемым. Это может вызвать проблемы. –

+0

Это всегда происходит с оптимизацией ограничений. Однако оптимизация Монте-Карло может помочь избежать этой проблемы: optim (par = init, method = "SANN") –

+0

Это глупое утверждение. LP считается непрерывным и дифференцируемым. Цель и каждое ограничение непрерывны и дифференцируемы. –

Смежные вопросы