使用nsga2包mco优化具有多个输入变量的公式

时间:2017-06-09 17:11:28

标签: r optimization nonlinear-optimization evolutionary-algorithm

我有一个公式,我希望通过8个输入参数/变量/尺寸/标准来最大化。对于下面的示例,我将其简化为仅由两部分组成的公式。基于信息here我一直在使用调用nsga2的mco包。

以下是设置:

#calculate an s curve for advertising1
Index = (0:250)    
advertising1.sAlpha = .953
advertising1.sBeta = 0.0000000003
advertising1.Max = 53460404
advertising1.Media = Index*advertising1.Max/100
advertising1.scurve = advertising1.sBeta^(advertising1.sAlpha^Index)

advertising1.Beta = 2989.589
advertising1.Cost = .095

#function to convert spend to media, get the response, find the s curve, and return number of sales for advertising1

advertising1.Spend = function(advertising1Spend) {
    monthly.spend = advertising1Spend/12
    Media = monthly.spend/advertising1.Cost
    response.index = findInterval(Media, advertising1.Media)
    scurve = advertising1.scurve[response.index]
    sales = scurve*advertising1.Beta
    return(sales)
}

#calculate an s curve for advertising2
advertising2.sAlpha = .6
advertising2.sBeta = 0.000000001
advertising2.Max = 90
advertising2.Media = Index*advertising2.Max/100
advertising2.scurve = advertising2.sBeta^(advertising2.sAlpha^Index)

advertising2.Beta = 4597.285
advertising2.Cost = 38540.12

#function to convert spend to media, get the response, find the s curve, and return number of sales for advertising2
advertising2.Spend = function(advertising2Spend) {
    monthly.spend = Spend/12
    Media = monthly.spend/advertising2.Cost
    response.index = findInterval(Media, advertising2.Media)
    scurve = advertising2.scurve[response.index]
    sales = scurve*advertising2.Beta
    return(sales)
}

这些功能可以根据需要运行。我可以通过他们每年的支出金额,他们将返回每月预计的销售数字。

下一步:定义要优化的功能。

Optimize.Spend = function(advertising1Spend, advertising2Spend) {
    advertising1.Spend(advertising1Spend) + 
    advertising2.Spend(advertising2Spend)
}

此功能也可按预期工作。我还想将预算设置为约束,例如advert1Spend + advertising2Spend< = 50000000。

Budget = function(advertising1Spend, advertising2Spend) {
    advertising1Spend + advertising2Spend <= 50000000
}

最后,我尝试优化功能如下。我已经设置了各个变量的界限,并输入了我的约束。

nsga2(Optimize.Spend, 2, 2, lower.bounds = c(0, 0), upper.bounds = 
c(60944860.56, 41623333.92), generations = 100, constraints = Budget, cdim = 1)

总之,我希望找到每个输入变量的最佳支出金额,这将在给定预算的情况下产生最大的销售额。首先,这种优化在R中是否可行?我使用正确的包裹/电话吗?

目前代码失败,&#34;广告错误2(advertising2Spend):参数&#39; advertising2Spend&#39;缺少,没有默认值。&#34;我觉得问题可能与优化函数的编写方式有关,但我无法弄清楚如何改进它。我没见过的例子在优化函数中有多个输入参数。

我还需要&#34;反向&#34;公式,因为nsga2是一个最小化函数,我想最大化。但首先要做的是......我怎么能让这个包给我工作?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

以下是我最终使用包DEoptimR进行的操作。

parameters = c(FALSE, FALSE)

Optimize.Spend = function(parameters) {
-Advertising1.Spend(parameters[1]) - Advertising2.Spend(parameters[2])
}

Budget = function(parameters) {-parameters[1] - parameters[2] + 100000000 <= 0
}

JDEoptim(lower = c(0,0), upper = c(60944860.56, 41623333.92), fn = Optimize.Spend, constr = Budget, maxiter = 2000)

包RccpDE也有效。我的主要问题是我需要一个可以进化优化的软件包。