首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法用范围值对r中参数约束和进行优化

无法用范围值对r中参数约束和进行优化
EN

Stack Overflow用户
提问于 2022-08-13 10:15:55
回答 1查看 63关注 0票数 1

我是优化技术的新手,并试图计算出3参数的值。

New_budget_fb

New_budget_tv

New_budget_radio

最小化CPO的值。

但我不知道如何添加以下约束,即参数之和:

New_budget_fb + New_budget_tv + New_budget_radio <= 550 &

New_budget_fb + New_budget_tv + New_budget_radio >= 350

下面是我尝试过的代码,但是给了我一个错误。添加了多个print()来计算。

代码语言:javascript
复制
library(tidyverse)

fn_budget_optim_test <- function(params){
  
  
  # Unknown params used in below equations
  New_budget_fb = params[1]
  New_budget_tv = params[2]
  New_budget_radio = params[3]
  
  print(paste("Parameters 1,2,3:",New_budget_fb,New_budget_tv,New_budget_radio))
  
  contribution_fb = ((70.6 * 1.0 + New_budget_fb)^0.3596438) * 2.015733
  contribution_tv = ((16 * 0.001 + New_budget_tv)^0.8996762) * 1.073207
  contribution_radio = (40.8 * 0.001 + New_budget_radio)^0.001 * -6086.523408
  contribution_intercept = 6081.045489
  
  sales_prediction = sum(contribution_fb,contribution_tv,contribution_radio,contribution_intercept)
  
  print(paste("sales prediction:", sales_prediction))
  
  CPO = (New_budget_fb + New_budget_tv + New_budget_radio) / sales_prediction
  
  print(paste("CPO:",CPO))
  
  
  ## Adding constraint
  if(
    (New_budget_fb + New_budget_tv + New_budget_radio) <= 550 & 
    (New_budget_fb + New_budget_tv + New_budget_radio) >= 350
  ) return(CPO)
  
  else return(NA)
}

optim(par = c(150,150,50),
      fn = fn_budget_optim_test, 
      # lower = c(350,350,350),
      # upper = c(550,550,550),
      method = "L-BFGS-B")

输出与错误:

代码语言:javascript
复制
[1] "Parameters 1,2,3: 150 150 50"
[1] "sales prediction: 82.0849314406196"
[1] "CPO: 4.26387637605802"
[1] "Parameters 1,2,3: 150.001 150 50"
[1] "sales prediction: 82.0849543262375"
[1] "CPO: 4.26388736977254"
[1] "Parameters 1,2,3: 149.999 150 50"
[1] "sales prediction: 82.0849085549353"
[1] "CPO: 4.26386538234082"
Error in optim(par = c(150, 150, 50), fn = fn_budget_optim_test, method = "L-BFGS-B") : 
  non-finite finite-difference value [1]

我理解这种从带有约束视频的Optim编写约束的方法。

会感谢这里的任何帮助。

更新:

能够使用Rsolnp::solnp等式约束进行尝试,但仍然无法在 inequlity 上进行尝试,因为我不清楚在这个函数中使用inequlity的情况。

下面的代码尝试对等式有效,即params和= 350

代码语言:javascript
复制
opt_func <- function(params){
  
  # Unknown params used in below equations
  New_budget_fb = params[1]
  New_budget_tv = params[2]
  New_budget_radio = params[3]
  
  print(paste("Parameters 1,2,3:",New_budget_fb,New_budget_tv,New_budget_radio))
  
  contribution_fb = ((70.6 * 1.0 + New_budget_fb)^0.3596438) * 2.015733
  contribution_tv = ((16 * 0.001 + New_budget_tv)^0.8996762) * 1.073207
  contribution_radio = (40.8 * 0.001 + New_budget_radio)^0.001 * -6086.523408
  contribution_intercept = 6081.045489
  
  sales_prediction = sum(contribution_fb,contribution_tv,contribution_radio,contribution_intercept)
  
  print(paste("sales prediction:", sales_prediction))
  
  CPO = (New_budget_fb + New_budget_tv + New_budget_radio) / sales_prediction
  
  print(paste("CPO:",CPO))
  return(CPO)  
}

  ## Adding constraint
equality_func <- function(params){
  New_budget_fb = params[1]
  New_budget_tv = params[2]
  New_budget_radio = params[3]
  
  New_budget_fb + New_budget_tv + New_budget_radio
}

Rsolnp::solnp(c(5,5,5),
      opt_func, #function to optimise
      eqfun=equality_func, #equality constrain function 
      eqB=350,   #the equality constraint value
      LB=c(0,0,0) #lower bound for parameters i.e. greater than zero      
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-08 03:02:52

我能够在目标函数中添加不同的约束,并将其最小化:

代码语言:javascript
复制
library(DEoptim)

fn_budget_optim_test <- function(params)
{
  New_budget_fb <- params[1]
  New_budget_tv <- params[2]
  New_budget_radio <- params[3]

  contribution_fb <- ((70.6 * 1.0 + New_budget_fb) ^ 0.3596438) * 2.015733
  contribution_tv <- ((16 * 0.001 + New_budget_tv) ^ 0.8996762) * 1.073207
  contribution_radio <- (40.8 * 0.001 + New_budget_radio) ^ 0.001 * -6086.523408
  contribution_intercept <- 6081.045489
  
  sales_prediction <- sum(contribution_fb, contribution_tv, contribution_radio, contribution_intercept)
  CPO <- (New_budget_fb + New_budget_tv + New_budget_radio) / sales_prediction
  
  if(is.nan(CPO))
  {
    return(10 ^ 30)
    
  }else
  {
    if((New_budget_fb + New_budget_tv + New_budget_radio) <= 550 & 
       (New_budget_fb + New_budget_tv + New_budget_radio) >= 350 &
       (CPO >= 0))
    {
      return(CPO)
      
    }else
    {
      return(10 ^ 30)
    } 
  }
}

obj_DEoptim <- DEoptim(fn = fn_budget_optim_test, lower = rep(0, 3), upper = rep(550, 3),
                       control = list(itermax = 1000))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73343384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档