Оптимизация формулы с несколькими входными переменными с помощью mco пакета nsga2

У меня есть формула, которую я хочу максимизировать с помощью 8 входных параметров/переменных/размеров/критериев. Для приведенного ниже примера я упростил его до формулы из двух частей. Основываясь на информации здесь, я использовал пакет mco, вызывающий nsga2. .

Вот настройка:

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

Эта функция также работает, как и ожидалось. Я также хочу установить бюджет в качестве ограничения, например, реклама1Расходы + реклама2Расходы ‹= 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? И я использую правильный пакет/звонок?

В настоящее время код дает сбой с ошибкой в ​​Advertising2 (advertising2Spend): аргумент «advertising2Spend» отсутствует, по умолчанию нет». Я чувствую, что проблема может быть связана с тем, как написана функция оптимизации, но я не могу понять, как ее улучшить. Ни один из примеров, которые я видел, не использует несколько входных параметров в функции оптимизации.

Мне также нужно было бы как-то «обратить» формулу, поскольку nsga2 является функцией минимизации, а я хочу максимизировать. Но обо всем по порядку... Как заставить пакет работать на меня?

Спасибо за любую помощь.


person Xander    schedule 09.06.2017    source источник


Ответы (1)


Вот что я сделал с пакетом 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 тоже работал. Моя основная проблема заключалась в том, что мне нужен был пакет, который эволюционно оптимизировался бы.

person Xander    schedule 26.06.2017