R для решения маркетинговой задачи линейного программирования - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть эта проблема, и я знаю ответ, но я должен быть в состоянии решить ее с помощью R

. Существует 5 кампаний, называемых A, B, C, D, E, существует максимально возможный бюджет, которыйможно потратить на каждую кампанию и рентабельность инвестиций за каждый доллар, потраченный на каждую кампанию.

будет выглядеть так

Campaign   Max Budget    ROI
  A         156.09       0.77
  B         73.92        1.46
  C         65.8         2.14
  D         43.68        0.77
  E         41.01        1.81

есть два ограничения, вы можете потратить всего 100во всех кампаниях, и вы не можете тратить больше, чем ваш максимальный бюджет, на каждую кампанию, и вы пытаетесь максимизировать свою прибыль, и это ваш ROI, умноженный на бюджет, потраченный на кампанию.

Я знаю ответбудет потратить 65,8 на кампанию C, потому что она имеет более высокий ROI, чем потратить 34,2 на кампанию E, потому что у вас будет второй по величине ROI, и при этом вы достигнете ограничения максимальных затрат 100.

Если кто-то можетпомогите мне настроить это с помощью lpSolveAPI или lpsolve, заранее спасибо

это то, что я пробовал до сих пор

 library("lpSolveAPI")

 model<-make.lp(ncol=5)
 m1<-lp.control(model, sense="max", verbose="neutral")

 m2<-set.objfn(model, obj=c(120.1893,107.9232,140.812,33.6336,74.2462))

 m3<-set.bounds(model, upper =c(156.09,73.92,65.8,43.68,41.02))

 m4<-add.constraint(model, c(1,1,1,1,1), "<=",100)

 solve(model)


 get.variables(model)
 34.2  0.0 65.8  0.0  0.0

Почему я получаю 65,8 на кампанию C, но 34,2на A, это должно быть на E ??Я предполагаю, что моя целевая функция неверна, для целевой функции я умножаю ROI на максимальный бюджет и использую эти коэффициенты.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Попробуйте, используя dat в примечании ниже:

library(lpSolveAPI)

n <- nrow(dat)
model <- make.lp(0, n)
control <- lp.control(model, sense = "max")

set.objfn(model, dat$ROI)

set.bounds(model, upper = dat$Max_Budget)
add.constraint(model, rep(1, n), "<=", 100)

solve(model)
## [1] 0

get.variables(model)
## [1]  0.0  0.0 65.8  0.0 34.2

Примечание

Ввод в воспроизводимой форме:

Lines <- "
Campaign   Max_Budget    ROI
  A         156.09       0.77
  B         73.92        1.46
  C         65.8         2.14
  D         43.68        0.77
  E         41.01        1.81"
dat <- read.table(text = Lines, header = TRUE)
0 голосов
/ 19 декабря 2018

Я думаю, что использование целой модели решения уравнений здесь излишне, так как нечего балансировать между кампаниями.

Если я правильно понимаю, вы хотите потратить как можно больше денег на кампанию ссамый высокий ROI, что осталось на втором месте, что осталось ... и т. д., и т. д. До тех пор, пока все деньги не будут потрачены.

Мой подход будет сортировать по ROI и вычислять совокупную сумму, чтобы узнатьтуда, где вы получите.Если ваши данные находятся в data.frame, называемом df:

df <- df[order(df$ROI, decreasing=TRUE), ]
df$spend <- pmin(df$MaxBudget,
                 pmax(TotalMoney-cumsum(c(0, df$MaxBudget[-nrow(df)]),
                      0)

Распараллеленными, вы тратите на каждую кампанию либо максимальный объем, либо оставшуюся сумму после того, как все более «полезные» кампании имеютбыло профинансировано, что меньше.А «то, что осталось» определяется либо ничем, либо TotalMoney минус сумма всех более высоких кампаний.

...