【发布时间】:2018-10-20 05:56:45
【问题描述】:
我有以下功能,想优化参数x 和y 以最大化输出。我正在尝试使用optimise 来做到这一点。
编辑
感谢这里的 cmets,我能够使用 Rsolnp::solnp 进行优化。
但是现在当我添加上限和下限时出现错误。
见下例
客观函数:
my_fn <- function(x) {
z <- ifelse(x[1] < 1000000, 0,
ifelse(x[1] < 19500000, x[1] * 0.0175,
ifelse(x[1] < 20500000, x[1] * 0.0190,
ifelse(x[1] < 21500000, x[1] * 0.0220,
ifelse(x[1] < 22500000, x[1] * 0.0270,
x[1] * 0.0340))))) +
ifelse(x[2] < 750000, 0,
ifelse(x[2] < 15750000, x[2] * 0.0100,
ifelse(x[2] < 16500000, x[2] * 0.0150,
ifelse(x[2] < 17250000, x[2] * 0.0275,
ifelse(x[2] < 18000000, x[2] * 0.0375,
ifelse(x[2] < 18750000, x[2] * 0.0450,
x[2] * 0.0550)))))) +
return(-z) # because I want to maximise
}
等式函数:
my_fn_equal <- function(x) {
z1 = x[1] + x[2]
return(z1)
}
我正在使用以下内容:
library(Rsolnp)
solnp(pars = c(1000000, 750000), # initial values
fun = my_fn, # objective function
eqfun = my_fn_equal, # equality function
eqB = c(17000000) # euqlity constraint
)
而且效果很好。 但是一旦我添加了下限和上限,我就会开始出错:
solnp(pars = c(1000000, 750000), # initial values
fun = my_fn, # objective function
eqfun = my_fn_equal, # equality function
eqB = c(17000000), # euqlity constraint
LB = c(1000000, 750000), # lower bound for parameters
UB = c(16000000, 16000000) # upper bound for parameters (I chose 16M randomly)
)
问题反转 Hessian 的结果:
solnp-->The linearized problem has no feasible
solnp-->solution. The problem may not be feasible.
Iter: 1 fn: -25000.0000 Pars: 1000000.00000 750000.00000
solnp--> Solution not reliable....Problem Inverting Hessian.
$pars
[1] 1000000 750000
$convergence
[1] 2
$values
[1] -25000 -25000
$lagrange
[1] 0
$hessian
[,1] [,2]
[1,] 1 0
[2,] 0 1
$ineqx0
NULL
$nfuneval
[1] 7
$outer.iter
[1] 1
$elapsed
Time difference of 0.1664431 secs
$vscale
[1] 25000 15250000 1 1
约束是:
# x[1] >= 1000000
# x[2] >= 750000
# x[1] + x[2] = 17000000
为什么在选择边界时会出现这些错误? 它们是什么意思?
此外,似乎每次更改初始值时,优化值都会更改。为什么我每次都不能获得最大化输出的相同参数?
谢谢!
【问题讨论】:
-
可能是函数定义方式错误,
optimise无法处理或不喜欢步进函数。 -
看起来如果不使用一些聪明的包可能无法使用约束来解决。我找到了stackoverflow.com/questions/30494083/…
-
是的,我默认使用
optimise。但不确定这是否是优化阶跃函数的正确方法。 -
optimize用于一维优化。你应该使用optim -
这看起来像一个分段线性模型。在这种情况下,通常最好用 MIP(混合整数程序)而不是 NLP 来解决问题。
标签: r optimization mathematical-optimization