给定目标函数的R优化

给定目标函数的R优化,r,optimization,R,Optimization,我得到7875.03 由于我是从正态分布取样,每次的输出都会不同,但它们应该是相同的,给或取几个百分点。我遇到的问题是,我不能任意指定上限。上述示例的上限(10000)是经过多次试验后确定的。如果说我把上限设为100000(我知道这是不合理的),它将返回该数字,而不是找到全球最低储蓄。你知道我的目标函数结构不正确吗 谢谢,对于给定的输入,函数并不总是返回相同的输出 可能会带来一些问题(会产生大量虚假的局部极小值): 您可以通过设置随机数生成器的种子来避免它们 在函数内部(例如,set.seed(

我得到7875.03

由于我是从正态分布取样,每次的输出都会不同,但它们应该是相同的,给或取几个百分点。我遇到的问题是,我不能任意指定上限。上述示例的上限(10000)是经过多次试验后确定的。如果说我把上限设为100000(我知道这是不合理的),它将返回该数字,而不是找到全球最低储蓄。你知道我的目标函数结构不正确吗


谢谢,

对于给定的输入,函数并不总是返回相同的输出 可能会带来一些问题(会产生大量虚假的局部极小值): 您可以通过设置随机数生成器的种子来避免它们 在函数内部(例如,
set.seed(1)
), 或者通过存储随机数并每次重复使用, 或者使用低差异序列(例如,
randtoolbox::sobol

由于它是一个变量的函数,您可以简单地绘制它以查看发生了什么: 它在10000之后有一个平台——优化算法无法区分 在高原和局部最优之间

optimize(f=obj1,
        success=success,
        start.capital=start.capital,
        target.savings=target.savings,
        monthly.mean.return=monthly.mean.return,
        monthly.ret.std.dev=monthly.ret.std.dev,
        monthly.inflation=monthly.inflation,
        monthly.inf.std.dev=monthly.inf.std.dev,
        n.obs = n.obs,
        n.sim = n.sim,
        lower = 0,
        upper = 10000,
        tol = 0.000000001,maximum=F)

f函数并不总是为给定的输入返回相同的输出
可能会带来一些问题(会产生大量虚假的局部极小值):
您可以通过设置随机数生成器的种子来避免它们
在函数内部(例如,
set.seed(1)
), 或者通过存储随机数并每次重复使用, 或者使用低差异序列(例如,
randtoolbox::sobol

由于它是一个变量的函数,您可以简单地绘制它以查看发生了什么: 它在10000之后有一个平台——优化算法无法区分 在高原和局部最优之间

optimize(f=obj1,
        success=success,
        start.capital=start.capital,
        target.savings=target.savings,
        monthly.mean.return=monthly.mean.return,
        monthly.ret.std.dev=monthly.ret.std.dev,
        monthly.inflation=monthly.inflation,
        monthly.inf.std.dev=monthly.inf.std.dev,
        n.obs = n.obs,
        n.sim = n.sim,
        lower = 0,
        upper = 10000,
        tol = 0.000000001,maximum=F)
f
optimize(f=obj1,
        success=success,
        start.capital=start.capital,
        target.savings=target.savings,
        monthly.mean.return=monthly.mean.return,
        monthly.ret.std.dev=monthly.ret.std.dev,
        monthly.inflation=monthly.inflation,
        monthly.inf.std.dev=monthly.inf.std.dev,
        n.obs = n.obs,
        n.sim = n.sim,
        lower = 0,
        upper = 10000,
        tol = 0.000000001,maximum=F)
f <- function(x) {
  set.seed(1)
  obj1(x,
      success             = success,
      start.capital       = start.capital,
      target.savings      = target.savings,
      monthly.mean.return = monthly.mean.return,
      monthly.ret.std.dev = monthly.ret.std.dev,
      monthly.inflation   = monthly.inflation,
      monthly.inf.std.dev = monthly.inf.std.dev,
      n.obs               = n.obs,
      n.sim               = n.sim 
  )
}
g <- Vectorize(f)
curve(g(x), xlim=c(0, 20000))
obj2 <- function(monthly.savings) {
  set.seed(1)
  req = matrix(start.capital, n.obs+1, n.sim)
  monthly.invest.returns <- matrix(0, n.obs, n.sim)
  monthly.inflation.returns <- matrix(0, n.obs, n.sim)
  monthly.invest.returns[] <- rnorm(n.obs * n.sim, mean = monthly.mean.return, sd = monthly.ret.std.dev)
  monthly.inflation.returns[] <- rnorm(n.obs * n.sim, mean = monthly.inflation, sd = monthly.inf.std.dev)
  for (a in 1:n.obs)
    req[a + 1, ] <- req[a, ] * (1 + monthly.invest.returns[a,] - monthly.inflation.returns[a,]) + monthly.savings
  ending.values <- req[nrow(req),]
  suc <- sum(ending.values>target.savings)/n.sim
  success - suc
}
uniroot( obj2, c(0, 1e6) )
# [1] 7891.187