R. Добавить условия в функцию оптимизации - PullRequest
0 голосов
/ 03 января 2019

У меня есть следующая функция оптимизации, аналогичная этой: R.Запустить функцию оптимизации во фрейме данных :

main <- function(p1, p2, n1, n2, pE) {

  # FIND MINIMUM a
  func <- function(a) {
    Mopt <- (p1-a*pE)/(1-a) 
    f_n <- (Mopt-p2)^2-Mopt*(1-Mopt)/(n1-1) - p2*(1-p2)/(n2-1)
    f_d <- Mopt*(1-p2)+p2*(1-Mopt)
    f_v <- f_n/f_d
    }
    opt <- optimize(func, seq(0, 1,by=0.01), maximum=FALSE)$minimum
  }

Здесь аргументы «main» - это столбцы из фрейма данных.Функция возвращает минимальное значение «a», необходимое для получения минимального значения f_v.Я хотел бы добавить некоторые условия к функции или, другими словами, заставить определенные объекты получать значения в определенном диапазоне, чтобы получить минимум f_v.Например, Mopt должен следовать:

0 < Mopt < 1

и (1 - a) должно следовать:

(1 - a) > 0. 

Я не уверен, как это сделать в контексте оптимизации.

1 Ответ

0 голосов
/ 03 января 2019

Я думаю, просто добавить условие будет работать. Код может быть таким.

func <- function(a) {
  a = min(a, 1-1e-7);
  Mopt <- max(min((p1-a*pE)/(1-a), 1-1e-7), 1e-7);
  #here means a<1 and 0<Mopt<1. 1e-7 ensures the inequality. It can be 1e-6 or 1e-8 depends on the precision you need

  f_n <- (Mopt-p2)^2-Mopt*(1-Mopt)/(n1-1) - p2*(1-p2)/(n2-1)
  f_d <- Mopt*(1-p2)+p2*(1-Mopt)
  f_v <- f_n/f_d
  }
opt <- seq(0, 1, 1e-7)[which.min(sapply(seq(0, 1, 1e-7), func))]

Дополнение: Приведенный выше код вернул бы право $objective, но может не выполнить поиск minimum. Для поиска минимума, функция должна быть.

func <- function(a) {
  if ((1-a)<1e-7) return(Inf);
  #Ensure the optimization is reached in the range of condition

  Mopt <-(p1-a*pE)/(1-a);
  if (Mopt<1e-7 || Mopt>(1-1e-7)) return(Inf);
  #Ensure the optimization is reached in the range of condition

  f_n <- (Mopt-p2)^2-Mopt*(1-Mopt)/(n1-1) - p2*(1-p2)/(n2-1)
  f_d <- Mopt*(1-p2)+p2*(1-Mopt)
  f_v <- f_n/f_d
  }
opt <- seq(0, 1, 1e-7)[which.min(sapply(seq(0, 1, 1e-7), func))]

Это очень много времени, но доступно, когда вам не нужно повторять вычисления много раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...