【问题标题】:Adding a constraint to a simple Optimization in R向 R 中的简单优化添加约束
【发布时间】:2021-07-06 19:47:59
【问题描述】:

我在 SO 上查看了几个类似的问题,但仍然无法解决。但我希望添加一个限制,即音量变化(新音量/旧音量 - 1 >= -10%)不能小于 -10%。

示例

Customer Old_volume Elasticity Price
X 100 -0.68 15.00
#example dataset
df <- data.frame(customer = c("X"),
                 old_volume = c(100),
                 elasticity = c(-0.68),
                 price = c(15.00))

#function
f3 <- function(x) {
         new_vol = 100 * (1+(-0.68 * x))
         new_rev = new_vol * (15.00 * (1+x))
         new_cost = new_vol * 11.25
     
         return(new_rev - new_cost)  }

n_vol <- function(x) {
         new_vol = 100 * (1+(-0.68 * x))
         return(new_vol)  }

#example run function
f3(0.25)
>>>[1] 622.5

#running the optimization
res <- optimize(f3, lower=0, upper=10, maximum = TRUE)
res$maximum
>>>0.6102941

res$objective
>>>[1] 754.9081

n_vol(0.6102941)
>>> 58.5

因此 vol change % = 58.5/100-1 = -0.415,但我想将其限制为 -0.1。

现在我想添加 new_vol/old_vol-1 >= -0.1 的约束。但是,我不确定如何使用Optimize()optim()lpsolve() 添加它。我正在阅读lpsolve() 文档,这似乎是要走的路,但我对objective.in 中的系数向量是什么感到困惑。还看看其他包,如 constrOptim,对于一维的东西来说似乎太复杂了。

谢谢

例如,通常在 Excel 上,我会有一堆包含这些计算的列,并在体积变化 >= -0.1 的约束下运行求解器。但是,如果行数 > 1,000,则运行宏需要很长时间

编辑:添加输入示例

【问题讨论】:

  • 感谢@G.Grothendieck。添加了一个输入示例

标签: r optimization statistics


【解决方案1】:

您可以用代数方式计算新边界。

change_inv <- function(frac, oldvol = 100) {  oldvol * (1 + frac) }
n_vol_inv <- function(vol) { (vol / 100 - 1) / -0.68 }
n_vol_inv(vol = change_inv(frac = -0.1))
# [1] 0.1470588
max_x <- optimize(f3, 
    lower = 0, 
    upper = n_vol_inv(vol = change_inv(-0.1)), 
    maximum = TRUE)
max_x
# $maximum
# [1] 0.1469922
# 
# $objective
# [1] 535.9664
n_vol(max_x$maximum) / 100 - 1
# [1] -0.09995469

不幸的是,这意味着最大值只是边界。

【讨论】:

  • 虽然约束“volume change >= -0.1”会设置一个下限。
  • 感谢您的出色工作!这可能需要一个全新的问题,但是如果我有两个不同的约束会发生什么?即New_rev变化> 0%?我假设我需要使用不同的函数/库来解决这个问题,因为它变得更加复杂,对吗?
猜你喜欢
  • 2011-07-23
  • 2012-12-08
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多