0

J'ai une formule que je veux maximiser avec 8 paramètres d'entrée/variables/dimensions/critères. Pour l'exemple ci-dessous, je l'ai simplifié en une formule en deux parties. Basé sur l'information here J'ai utilisé le paquetage mco appelant nsga2.Optimiser une formule avec plusieurs variables d'entrée en utilisant le paquet nsga2 mco

Voici la configuration:

#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) 
} 

Ces fonctions fonctionnent comme vous le souhaitez. Je peux leur passer un montant de dépenses annuel et ils vont retourner un chiffre d'affaires mensuel prévu.

Ensuite: définissez la fonction à optimiser.

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

Cette fonction fonctionne également comme prévu. Je veux aussi définir un budget comme une contrainte telle que advertising1Spend + advertising2Spend < = 50000000 par exemple.

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

Enfin, ma tentative d'optimisation de la fonction est la suivante. J'ai mis des limites sur les variables individuelles ainsi que dans ma contrainte. En termes de mots, je veux trouver le montant optimal des dépenses par variable d'entrée qui produira le plus de ventes pour un budget donné. Premièrement, ce type d'optimisation est-il même possible en R? Et est-ce que j'utilise le bon paquet/appel?

Actuellement le code échoue avec "Erreur dans advertising2 (advertising2Spend): l'argument 'advertising2Spend' est manquant, sans défaut." Je pense que le problème peut avoir à faire avec la façon dont la fonction d'optimisation est écrite, mais je ne peux pas comprendre comment l'améliorer. Aucun exemple que j'ai vu prendre plusieurs paramètres d'entrée dans la fonction d'optimisation.

Je voudrais aussi "inverser" la formule en quelque sorte puisque nsga2 est une fonction de minimisation et je veux maximiser. Mais la première chose est d'abord ... Comment puis-je obtenir le paquet pour travailler pour moi?

Merci pour toute aide.

Répondre

0

Voici ce que j'ai fini par faire avec le paquet 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) 

Le package RccpDE a également fonctionné. Mon problème principal était que j'avais besoin d'un package qui optimise l'évolution.