【问题标题】:Maximize a function with constraints最大化带有约束的函数
【发布时间】:2020-04-30 12:05:56
【问题描述】:

我有以下函数,我使用 optim() 将其最大化。

Budget = 2000 

X = 4
Y = 5


min_values = c(0.3,0)
start_values = c(0.3,0.5)
max_values = c(1,1)



sample_function <- function(z,Spend){
  Output = (z[1]*X*Spend) + (z[2]*Y*Spend) 
  return(Output)
}


MaxFunction <- optim(par=start_values ,fn= sample_function, method = "L-BFGS-B", lower = min_values , upper= max_values  ,control=list(maxit=100000 ,fnscale=-1), Spend= Budget)

但是我想在最大化时添加一些约束,例如:

 z[1] => 1/3

 z[1] + z[2] = 1 

任何帮助都将不胜感激,因为这与我正在解决的更复杂的问题有关。 或者如果有不使用 otpim() 解决问题的不同方法,请告诉我。

【问题讨论】:

  • 无法真正回答您的问题,因为我从未使用过 optim 函数。但只是想说您可以通过不定义像这样的输出来简化示例函数的代码sample_function &lt;- function(z,Spend){ (z[1]*X*Spend) + (z[2]*Y*Spend) } 该函数将返回任何打印的内容。
  • 对我来说这看起来像是一个线性规划问题。您可以尝试使用 lpSolve 包。找教程here
  • 嗨,Bas,它实际上不是线性规划问题,因为输出变量没有预定义

标签: r function optimization constraints maximization


【解决方案1】:

optim 不是约束优化的好选择,但只要您以不同的方式制定目标函数 sample_function,它仍然适用于您的情况。

下面是一个例子

min_values = 1/3
start_values = 0.5
max_values = 1

sample_function <- function(z,Spend){
    z*X*Spend + (1-z)*Y*Spend
}

MaxFunction <- optim(par=start_values ,
                     fn= sample_function, 
                     method = "L-BFGS-B", 
                     lower = min_values , 
                     upper= max_values,
                     control=list(maxit=100000 ,fnscale=-1), 
                     Spend= Budget)

如果要查看z1-z的元素分布,可以使用

z1 <- MaxFunction$par
z2 <- 1- z1
Zopt <- c(z1,z2)

这样

> Zopt
[1] 0.3333333 0.6666667

【讨论】:

  • 您好 Thomas,感谢您的回复。不幸的是,这对我不起作用,因为我的最终目标是获取 z 向量的参数值(所以我可以看到 Spend 变量是如何分布的)。这非常重要,因为当我弄清楚这件事时,z 向量将包含 > 2 个参数。
  • 再次感谢,但如果您添加另一个参数 X=4 Y =5 Z = 8 min_values = 1/3 start_values = 0.5 max_values = 1 sample_function X花费 + (1-z)*Y花费 + (1-((1-z)+z))*Z花费 } MaxFunction
  • @ChrisSolomou 正如我在回答开头所说,optim 不适合约束优化。您只有两个参数XY 的情况是一种特殊情况,因为使用单个z 来表示z1-z 就足够了。此方法在参数个数大于 2 时无法扩展,需要其他工具。我建议您使用其他软件包中的lpSolvefminconCVX,而不是使用带有基本R 的optim
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2017-07-07
相关资源
最近更新 更多