【问题标题】:Nonlinear optimization with R for grouped variables使用 R 对分组变量进行非线性优化
【发布时间】:2019-05-07 07:33:14
【问题描述】:

我正在尝试找到以下目标函数的最大值:

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)

我正在使用 R 的 nloptr 库

库(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)

使用上面的代码,我可以找到最大化我的目标函数的出价值,但我想根据“集群”对我的值进行分组,并为每个集群找到在相同约束条件下最大化目标函数的“出价”值。

您能帮我解决这个问题吗?

【问题讨论】:

    标签: r function mathematical-optimization nonlinear-optimization


    【解决方案1】:

    我找到了一个不是最好但节省了我一天的解决方案。简而言之,我为目标函数和约束编写了循环

    而新形式的目标函数变得像这样。

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

    作为最后一步,我在优化算法中添加了“cluster”参数:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      相关资源
      最近更新 更多