Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:如何向DEoptim添加附加约束_R_Optimization_Differential Evolution - Fatal编程技术网

R:如何向DEoptim添加附加约束

R:如何向DEoptim添加附加约束,r,optimization,differential-evolution,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(

我试图使用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 )
}
我想添加一个简单的约束:

 sum(n * delta) = target
换言之,优化参数n的总和乘以my In_数据帧中的delta和某种目标。为了简单起见,让我们假设为0.5。我该如何施加压力

 sum(n * delta) = 0.5

作为约束?谢谢你的帮助

DEOptim软件包说明

实现了全局优化的差分进化算法 实值参数的重值函数的优化 向量

全局优化的概念没有约束的位置,它也被称为无约束优化。很抱歉,但这不可能直接实现。已经说过,如果你必须这样做的话,你可以一直使用“拉格朗日乘数”技巧。为此,您需要执行以下操作:

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

在这里你可以惩罚你的约束松弛

DEOptim软件包说明

实现了全局优化的差分进化算法 实值参数的重值函数的优化 向量

全局优化的概念没有约束的位置,它也被称为无约束优化。很抱歉,但这不可能直接实现。已经说过,如果你必须这样做的话,你可以一直使用“拉格朗日乘数”技巧。为此,您需要执行以下操作:

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

在这里你可以惩罚你的约束松弛

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

最明显的是,在我的特定目标函数中,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
}

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

最明显的是,在我的特定目标函数中,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
}

obj_func_sum_RRRs我正在使用一个包装器,它根据外部约束定制DEoptim的调用。我承认它不是很优雅,但在某种程度上是有效的。
我的目标函数——蒙特卡罗模拟——相当耗时
所以约束真的很有用。。。
克里斯


由于我所做的工作非常特殊(中子束光学优化的蒙特卡罗光线跟踪),我没有看到任何理由添加代码。我认为这才是真正重要的概念。我很乐意与任何感兴趣的人分享我所拥有的。让我知道。。。。Chris

我正在使用一个包装器,它根据外部约束定制DEoptim的调用。我承认它不是很优雅,但在某种程度上是有效的。 我的目标函数——蒙特卡罗模拟——相当耗时 所以约束真的很有用。。。 克里斯


由于我所做的工作非常特殊(中子束光学优化的蒙特卡罗光线跟踪),我没有看到任何理由添加代码。我认为这才是真正重要的概念。我很乐意与任何感兴趣的人分享我所拥有的。让我知道。。。。克里斯

谢谢,这很有道理。对于我可以采用的解决R中这个特定约束优化问题的方法,您还有其他建议吗?另外,我将如何以编程方式使用您的Legrange乘数版本?换句话说,在这种情况下,lambda只是Legrange乘数(达到目的的手段),但对于R来说,它只是另一个未定义的变量。如何让R继续最小化,求解lambda,然后将其替换回来,得到最终的优化解?换句话说,我可以在纸上做拉格朗日乘子,如何让R在这个优化问题的背景下做呢?对于第一个问题,你可以看看Lambda参数需要通过反复试验来选择,这就是为什么我称之为hack而不是解决方案。我做优化和R两者都做。用R和Gurobi实现两个世界的最佳效果…但Gurobi不是开源解算器。谢谢,这很有意义。对于我可以采用的解决R中这个特定约束优化问题的方法,您还有其他建议吗?另外,我将如何以编程方式使用您的Legrange乘数版本?换句话说,在这种情况下,lambda只是Legrange乘数(达到目的的手段),但对于R来说,它只是另一个未定义的变量。如何让R继续最小化,求解lambda,然后将其替换回来,得到最终的优化解?换句话说,我可以在纸上做拉格朗日乘子,如何让R在这个优化问题的背景下做呢?对于第一个问题,你可以看看Lambda参数需要通过反复试验来选择,这就是为什么我称之为hack而不是解决方案。我做优化和R两者都做。用R和Gurobi实现两个世界的最佳效果…但Gurobi不是开源解算器。仅供参考,我已经实现了这一点,我实际上得到了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
}