0

8つの入力パラメータ/変数/寸法/条件で最大化したい式があります。以下の例では、2部構成の式に簡略化しました。情報hereに基づいて、nsga2を呼び出すmcoパッケージを使用しています。ここで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) 
} 

この関数も期待どおりに機能します。私はまた、予算を制約として設定して、広告1Spend + advertising2Send < = 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でも可能ですか?そして、私は正しいパッケージ/コールを使用していますか?

現在、「ads2(advertising2Spend)のエラー:引数 'advertising2Spend'が欠落しています。デフォルトはありません。」私は問題が最適化関数の記述方法と関係しているかもしれないと思っていますが、改善方法を知ることはできません。私が見た例では、最適化関数で複数の入力パラメータを取ることはありません。

nsga2が最小化関数であり、最大化したいので、何らかの形で式を「逆転」する必要があります。しかし、最初のものが最初です...私はパッケージを私のために働かせるにはどうすればいいですか?

ありがとうございました。

答えて

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も有効です。私の主な問題は、進化的に最適化するパッケージが必要だったということでした。

関連する問題