R:如何向DEoptim

时间:2016-07-21 06:18:01

标签: r optimization differential-evolution

我试图使用DEoptim最小化目标函数,受一个简单的约束。我不清楚如何将简单约束添加到对DEoptim的调用。这是目标函数:

obj_min <- function(n,in_data) {
    gamma <- in_data$Gamma
    delta <- in_data$Delta
    theta <- in_data$Theta
    gammaSum <- sum(n * gamma)
    deltaSum <- sum(n * delta)
    thetaSum <- sum(n * theta)
    abs((EPC * gammaSum - 2 * abs(deltaSum)) / thetaSum )
}

我的映射函数(强加整数约束)如下:

 mappingFun <- function(x) {
    x[1:length(x)] <- round(x[1:length(x)], 0)
 }

我对DEoptim的呼吁是:

 out <- DEoptim(DTRRR_min, lower = c(rep(-5, length(in_data[, 1]))),
        upper = c(rep(5, length(in_data[, 1]))),
        fnMap = mappingFun, DEoptim.control(trace = F),in_data)

我的in_data对象(数据框)是:

   Underlying.Price  Delta  Gamma   Theta   Vega    Rho Implied.Volatility
 1            40.69 0.9237 3.2188 -0.7111 2.0493 0.0033             0.3119
 2            40.69 0.7713 6.2267 -1.6352 4.3240 0.0032             0.3402
 3            40.69 0.5822 8.4631 -2.0019 5.5782 0.0338             0.3229
 4            40.69 0.3642 8.5186 -1.8403 5.3661 0.0210             0.3086
 5            40.69 0.1802 6.1968 -1.2366 3.7517 0.0093             0.2966

我想添加一个简单的约束:

 sum(n * delta) = target

换句话说,优化参数n的总和乘以我的in_data数据帧中的增量总和到某种目标。为简单起见,我们只说0.5。我如何强加

 sum(n * delta) = 0.5

作为约束?谢谢你的帮助!

3 个答案:

答案 0 :(得分:0)

DEOptim包说明

  

实现全局差分进化算法   优化实值参数的实值函数   矢量。

全局优化的概念并不适用于约束,它也被称为无约束优化。很抱歉,但不可能直接。说过你可以随时使用&#34;拉格朗日的乘数&#34;黑客,如果你必须这样做。要做到这一点,你需要做类似的事情:

abs((EPC * gammaSum - 2 * abs(deltaSum))/thetaSum) - lambda* (sum(n * delta) - 0.5)

你惩罚约束的松弛。

答案 1 :(得分:0)

好的,谢谢你的所有建议。我从多个角度研究和解决了我的问题,我想与大家分享我的想法,以防他们对你们中的一些人有所帮助。

最明显的是,在我的特定目标函数中,deltaSum是一个变量,我试图将其约束为特定值。简单地将这个约束值替换为目标函数就是解决这个问题的方法(微不足道的)。但是,假设我要对目标函数中不是变量的变量引入约束,我可以简单地运行一个for循环,它为我想要强加的任何约束返回Inf,即:

obj_func_sum_RRRs <- function(n, in_data) {
#Declare deltaSum, gammaSum, thetaSum, vegaSum, and rhoSum from in_data

#Impose constraints
#No dividing by 0:
        if (thetaSum == 0) {
            return(Inf)
        }

#Specify that regardless of the length of vector of variables to 
#be optimized, we only want our final results to include either 4 or 6
#nonzero n's in our final optimized solution  

        if (!sum(n[1:length(n)] != 0) == 4 &
            !sum(n[1:length(n)] != 0) == 6) {
            return(Inf)
         }

    (deltaSum + gammaSum)/thetaSum
}

第一个for循环,(thetaSum == 0,返回Inf)有效,因为虽然Inf是优化器理解的解决方案(并且永远不会选择为最佳),但在R中除以0会返回NaN,其中&#34;符&#34;优化过程。这有点&#34; hacky&#34;,因为它可能不是解决问题的最有效计算方法,但说实话,我正在与一位亲密的朋友和软件架构师大师一起开发基础设施(它利用通过Microsoft Service Fabric部署的微服务,我们的远程回测仍然很快。这种方法实际上允许您对问题施加任何数量的约束,尽管需要进行进一步的测试以了解使用这种技术会导致计算复杂性变得多么繁重......

上面的拉格朗日技术是可行的,但只有在纸上推导出lambda的分析形式,然后在代码中实现。它在应用程序中并不总是实用的,虽然您可以编写一个算法来优化参数,但是将自己描绘成一个必须优化参数的角落听起来是个坏主意,而参数又是必要的。优化原始目标函数。如上所述,设置一个for循环似乎是更好的方法。

思考的食物......

答案 2 :(得分:-1)

我正在使用一个包装器,该包装器基于外部约束来自定义DEoptim的调用。我承认这不是很优雅,但在一定程度上可以奏效。 我的目标函数-蒙特卡洛模拟-非常耗时 所以约束真的很有帮助... 克里斯

由于我正在做的事情非常特殊(蒙特卡洛射线追踪,用于优化中子束光学),我看不到添加代码的任何理由。我认为真正重要的是这里的概念。我将很乐意与感兴趣的人分享我的经验。请让我知道...。克里斯