如何使用带约束的 lpSolve 最大化销售额
How to maximize sales using lpSolve with constraints
假设我正在尝试最大化销售额并有两个变量,花在两种类型广告上的金额,ads
和 ads2
美元,影响 sales
.
计算销售影响的线性模型后,我提取系数以获得预测销售的公式。然后我尝试通过优化广告数量来最大化预测销售额。
问题是广告的类型也应该有预算。如果没有此限制,所有广告预算都将花费在 ads
而不是 ads2
。
这导致销售额约为 140 美元,但可以牺牲一点销售额来满足此限制条件。
我不知道如何实现这个。我尝试调整 const 矩阵中的约束,但优化试图将所有广告强制为仅一种类型的广告。
library(tibble)
library(dplyr)
library(lpSolve)
data <- tribble(~"ads", ~"ads2", ~"sales",
100, 120, 100,
50, 90, 40,
20, 10, 10,
150, 110, 130,
190, 90, 160,
180, 300, 250,
110, 200, 100,
80, 70, 20,
50, 20, 10,
30, 100, 200,
100, 190, 40,
100, 200, 100,
40, 90, 80,
60, 80, 60,
200, 20, 100,
20, 200, 80,
30, 10, 30,
40, 90, 100,
80, 20, 80,
200, 150, 100,
80, 80, 40,
100, 10, 300,
150, 100, 60,
10, 100, 10
)
forecast <- lm(sales ~ ads + ads2, data = data)
coef <- forecast$coefficients
obj <- coef[2:3] # coefficients
const <- matrix(c(1, 1, # ads
1, 1), # ads2
nrow = 2)
min_items <- 250 # minimum total budget
max_items <- 300 # maximum total budget
rhs <- c(min_items, max_items)
direction <- c(">", "<")
optimum <- lp(direction = "max", obj, const, direction, rhs)
optimum$solution # budget spent on ads and ads2
optimum$objval + coef[1] # forecasted sales by using this budget
对于任何一种广告类型,optimum$solution
都不应该是 0,它应该是 return,例如 50 100 而不是 300 0 或 0 300。
问题已通过添加新约束 max_ads
并将其设置为您想要的广告的最大值来解决。此外,必须通过将 ads2
的相应约束设置为零来更改约束矩阵。方向的标志也必须改变。
const <- matrix(c(1, 1, # ads
0, 1), # ads2
nrow = 2)
max_ads <- 100 # maximum ads budget
max_items <- 300 # maximum total budget
rhs <- c(max_ads, max_items)
direction <- c("<", "<")
假设我正在尝试最大化销售额并有两个变量,花在两种类型广告上的金额,ads
和 ads2
美元,影响 sales
.
计算销售影响的线性模型后,我提取系数以获得预测销售的公式。然后我尝试通过优化广告数量来最大化预测销售额。
问题是广告的类型也应该有预算。如果没有此限制,所有广告预算都将花费在 ads
而不是 ads2
。
这导致销售额约为 140 美元,但可以牺牲一点销售额来满足此限制条件。
我不知道如何实现这个。我尝试调整 const 矩阵中的约束,但优化试图将所有广告强制为仅一种类型的广告。
library(tibble)
library(dplyr)
library(lpSolve)
data <- tribble(~"ads", ~"ads2", ~"sales",
100, 120, 100,
50, 90, 40,
20, 10, 10,
150, 110, 130,
190, 90, 160,
180, 300, 250,
110, 200, 100,
80, 70, 20,
50, 20, 10,
30, 100, 200,
100, 190, 40,
100, 200, 100,
40, 90, 80,
60, 80, 60,
200, 20, 100,
20, 200, 80,
30, 10, 30,
40, 90, 100,
80, 20, 80,
200, 150, 100,
80, 80, 40,
100, 10, 300,
150, 100, 60,
10, 100, 10
)
forecast <- lm(sales ~ ads + ads2, data = data)
coef <- forecast$coefficients
obj <- coef[2:3] # coefficients
const <- matrix(c(1, 1, # ads
1, 1), # ads2
nrow = 2)
min_items <- 250 # minimum total budget
max_items <- 300 # maximum total budget
rhs <- c(min_items, max_items)
direction <- c(">", "<")
optimum <- lp(direction = "max", obj, const, direction, rhs)
optimum$solution # budget spent on ads and ads2
optimum$objval + coef[1] # forecasted sales by using this budget
对于任何一种广告类型,optimum$solution
都不应该是 0,它应该是 return,例如 50 100 而不是 300 0 或 0 300。
问题已通过添加新约束 max_ads
并将其设置为您想要的广告的最大值来解决。此外,必须通过将 ads2
的相应约束设置为零来更改约束矩阵。方向的标志也必须改变。
const <- matrix(c(1, 1, # ads
0, 1), # ads2
nrow = 2)
max_ads <- 100 # maximum ads budget
max_items <- 300 # maximum total budget
rhs <- c(max_ads, max_items)
direction <- c("<", "<")