为什么 R 中的 constrOptim 在某些约束下找到次优解?

问题描述 投票:0回答:1

我正在使用 constrOptim 来找到两个投入之间预算的最佳分配,以产生最高的效益。

我假设最优分配将导致两种投入的边际效益相等。然而,在某些预算和效益函数下,情况并非如此。

示例:

#Define the benefit functions
benefit_c <- function(x){
  1832283199  + 162.1422 * x - 6.8976 * x *log(x)
}

benefit_m <- function(x){
  303009100 + 100.593 * x - 4.486285 * x *log(x)
}

# Corresponding marginal benefit functions
marg_c <- function(x){
  (162.1422- 6.8976)  - 6.8976 *log(x)
}

marg_m <- function(x) {
  (100.593- 4.486285)  - 4.486285  * log(x)
}

# Total benefit function
benefit_function <- function(x) {
  c <- x[1] 
  m <- x[2] 
  
  ben_func <- - (benefit_c(c) + benefit_m(m))
  names(ben_func) <- "tot_benefit"
  
  return(ben_func)
}

# Set parameters
# Budget
budget <- 2.5e9

# Initial starting points
eps <- .Machine$longdouble.eps # low number, but avoid zero due to logs
init_pars <- c(0.1, 0.1) # starting values

# Constraint matrices
constr_input_matrix <- matrix(c(1,0,0,1,-1,-1),
                              nrow = 3,ncol = 2,byrow = TRUE)
constr_output_matrix <- matrix(c(eps,eps,-budget),
                               nrow = 3,ncol = 1,byrow = TRUE)

# Run solver
log_solution <- constrOptim(theta = init_pars,
                            f = benefit_function,
                            grad = NULL,
                            ui = constr_input_matrix,
                            ci = constr_output_matrix,
                            control = list(reltol = eps) # sets a value for tolerance acceptable solution precision
)



# Find marginal benefits, should be equal
marg_c(log_solution$par[1])

marg_m(log_solution$par[2])

由此产生的边际效益分别为 7.16 和 7.33。

奇怪的是,如果我将预算设置为 2.4e9 或 2.6e9,我确实获得了相等的边际收益(分别为 7.46 和 6.95)。因此看来这可能是精度或容差的问题,但我无法纠正它。

造成这种情况的原因是什么以及如何调整?

r optimization constraints
1个回答
0
投票

当您观察到相等的边际效益时,我认为您在解决优化问题时没有任何问题。这是因为在尝试接近最优解时可能会满足“Karush-Kuhn-Tucker (KKT) 条件”。 因此,有时看到相同的边际效益并不奇怪。

您应该注意一些事实:

    你的边际效益函数
  1. marg_c

    marg_m
    ,确实分别是你的效益函数
    benefit_c
    benefit_m
    的一阶导数(我相信你可以用你的微积分知识手动推导它们)。换句话说,总收益
     benefit(x1,x2)
    相对于
    x1
    x2
    的偏导数分别为
    marg_c(x1)
    marg_m(x2)
    
    

  2. 在您的优化问题中,您有约束
  3. x1+x2 <= budget

    x1 >=0 
    x2 >= 0
    ,其中将引入
    松弛变量并讨论如何满足KKT条件。在一种情况下,当 x1* 时,可能会实现最优 
    x2*
    marg_c(x1*)==marg_m(x2*)==C
    ,其中
    C
    是由松弛变量选项之一选择确定的一些常数。也许你可以参考
    这里的一些例子
    更容易理解。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.