Вопрос:

Нелинейная оптимизация с R для сгруппированных переменных

r function mathematical-optimization nonlinear-optimization

104 просмотра

1 ответ

43 Репутация автора

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

objective <-function(bid,revenue,click,cost) {

    revenue_2 <- sum((revenue / cost)*                                                      
                    (bid*click*bid*(cost/click) / cost)^(-0.2*revenue/cost)*              
                    (bid*click)*bid*(cost/click))

  return(-revenue_2)
}

при условии

roas_2 <- function(bid, revenue,click,cost) {

  revenue_2 <- ((revenue / cost)*                                                      
               (bid*click*bid*(cost/click) / cost)^(-0.2*revenue/cost))*              
               (bid*click)*bid*(cost/click)

  cost_2 <- (bid*click)*bid*(cost/click)

  roas_2 <- (sum(revenue_2)/sum(cost_2)) -1.2

  return(-roas_2)
}

где мои значения следующие:

click <- c(123565, 94434, 79345, 152944, 83657, 67872, 80534, 48726, 107977, 138871, 116918, 41024, 63143)
revenue <- c(117251, 91806, 75356, 105787, 84419, 44139 , 57942 ,36283, 110902 ,130689, 116093, 36541, 37718)
cost <- c(93031,74764,73168,87510,66791,37637,50043,29209,90300,103276,93972,27228,32556)
cluster <- c(1,1,1,1,1,1,1,1,1,2,2,2,2)
bid <- c(1.2,1,1.6,1,1,1.2,1.2,1,1,1,1,1,1)

Я использую библиотеку Nloptr R

библиотека (nloptr)

res <- nloptr(x0=bid,
              eval_f=objective, 
              lb=c(0,0,0,0,0,0,0,0,0,0,0,0,0),
              ub=c(2,2,2,2,2,2,2,2,2,2,2,2,2),
              eval_g_ineq  = roas_2,
              # opts = list(algorithm="NLOPT_LN_COBYLA",maxeval=1000000),
              opts = list(algorithm="NLOPT_GN_ISRES",maxeval=105000),
              revenue=revenue,
              click=click,
              cost=cost)

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

Не могли бы вы помочь мне преодолеть эту проблему?

Автор: Bahadir Uyarer Источник Размещён: 30.12.2017 08:54

Ответы (1)


2 плюса

43 Репутация автора

Решение

Я нашел решение, которое не самое лучшее, но спасло мой день. Вкратце, я написал цикл для целевой функции и ограничения

И новая форма целевой функции стала такой.

   objective <-function(bid,revenue,click,cost, cluster) {

      revenue_2 <- 0

      for (i in 1:13) {

        t <- cluster[i]

          revenue_2[i] <- (revenue[i]/cost[i])*
                          ((bid[t]*click[i]*bid[t]*(cost[i]/click[i]) / cost[i])^(-0.2*revenue[i]/cost[i]))*
                          (bid[t]*click[i])*bid[t]*(cost[i]/click[i])

      } 

      revenue_2 <- sum(revenue_2)

      return(-revenue_2)
    }

Ограничение стало как:

roas_2 <- function(bid, revenue,click,cost,cluster) {

  revenue_2 <- 0
  cost_2 <- 0

  for(i in 1:13) {

    t <- cluster[i]

    revenue_2[i] <- ((revenue[i] / cost[i])*                                                     
                            (bid[t]*click[i]*bid[t]*(cost[i]/click[i]) / cost[i])^(-0.2*revenue[i]/cost[i]))*              #new cost / old cost
                            (bid[t]*click[i])*bid[t]*(cost[i]/click[i])

    cost_2[i] <- (bid[t]*click[i])*bid[t]*(cost[i]/click[i])

    roas_2 <- (sum(revenue_2)/sum(cost_2)) - 1.2 

  }

  return(-roas_2)
}

В качестве последнего шага я добавил параметр «кластер» в алгоритм оптимизации:

res <- nloptr(x0=bid,
              eval_f=objective, 
              lb=rep_len(0, 13),
              ub=rep_len(2, 13),
              eval_g_ineq  = roas_2,
              # opts = list(algorithm="NLOPT_LN_COBYLA",maxeval=1000000),
              opts = list(algorithm="NLOPT_GN_ISRES",maxeval=100000),
              revenue=revenue,
              click=click,
              cost=cost,
              cluster=cluster)
Автор: Bahadir Uyarer Размещён: 01.01.2018 09:41
Вопросы из категории :
32x32