我正在使用 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)。因此看来这可能是精度或容差的问题,但我无法纠正它。
造成这种情况的原因是什么以及如何调整?
当您观察到相等的边际效益时,我认为您在解决优化问题时没有任何问题。这是因为在尝试接近最优解时可能会满足“Karush-Kuhn-Tucker (KKT) 条件”。 因此,有时看到相同的边际效益并不奇怪。
您应该注意一些事实:
marg_c
和
marg_m
,确实分别是你的效益函数benefit_c
和benefit_m
的一阶导数(我相信你可以用你的微积分知识手动推导它们)。换句话说,总收益 benefit(x1,x2)
相对于x1
和x2
的偏导数分别为marg_c(x1)
和marg_m(x2)
。
x1+x2 <= budget
、
x1 >=0
和x2 >= 0
,其中将引入松弛变量并讨论如何满足KKT条件。在一种情况下,当 x1*
时,可能会实现最优 x2*
和 marg_c(x1*)==marg_m(x2*)==C
,其中 C
是由松弛变量选项之一选择确定的一些常数。也许你可以参考这里的一些例子更容易理解。