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.