Nonlinear optimization with R for grouped variables

自古美人都是妖i 提交于 2019-12-06 05:22:41

I found a solution which is not best but saved my day. Briefly, I wrote loop for objective function and constraint

And new form of objective function became like.

   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)
    }

Constraint became like:

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)
}

As last step I added "cluster" parameter to optimization algorithm:

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)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!