Максимизировать функцию с ограничениями - PullRequest
1 голос
/ 30 апреля 2020

У меня есть следующая функция, которую я максимизирую с помощью optim ().

Budget = 2000 

X = 4
Y = 5


min_values = c(0.3,0)
start_values = c(0.3,0.5)
max_values = c(1,1)



sample_function <- function(z,Spend){
  Output = (z[1]*X*Spend) + (z[2]*Y*Spend) 
  return(Output)
}


MaxFunction <- optim(par=start_values ,fn= sample_function, method = "L-BFGS-B", lower = min_values , upper= max_values  ,control=list(maxit=100000 ,fnscale=-1), Spend= Budget)

Однако я хотел бы добавить некоторые ограничения при максимизации, такие как:

 z[1] => 1/3

и

 z[1] + z[2] = 1 

Любая помощь будет высоко ценится, так как это связано с более сложной проблемой, которую я решаю. Или, если есть другой метод решения проблемы без использования otpim (), пожалуйста, сообщите мне.

1 Ответ

1 голос
/ 30 апреля 2020

optim не является хорошим вариантом для ограниченной оптимизации, но это все еще возможно для вашего случая, если вы сформулируете целевую функцию sample_function другим способом.

Ниже приведен пример

min_values = 1/3
start_values = 0.5
max_values = 1

sample_function <- function(z,Spend){
    z*X*Spend + (1-z)*Y*Spend
}

MaxFunction <- optim(par=start_values ,
                     fn= sample_function, 
                     method = "L-BFGS-B", 
                     lower = min_values , 
                     upper= max_values,
                     control=list(maxit=100000 ,fnscale=-1), 
                     Spend= Budget)

Если вы хотите увидеть распределение элементов z и 1-z, вы можете использовать

z1 <- MaxFunction$par
z2 <- 1- z1
Zopt <- c(z1,z2)

, например

> Zopt
[1] 0.3333333 0.6666667
...