我是优化技术的新手,并试图计算出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()来计算。
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")输出与错误:
[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
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
)发布于 2022-10-08 03:02:52
我能够在目标函数中添加不同的约束,并将其最小化:
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))https://stackoverflow.com/questions/73343384
复制相似问题