首页 > 解决方案 > 如何使用带约束的 lpSolve 最大化销售额

问题描述

假设我正在尝试最大化销售额,并且有两个变量,在两种类型的广告上花费的金额adsads2美元,这会影响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,它应返回例如 50 100 而不是 300 0 或 0 300。

标签: roptimizationlpsolve

解决方案


该问题已通过添加新约束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("<", "<")

推荐阅读