如何用lpSolve带约束最大化销售额?二元广告投放优化问题
解决线性规划优化广告预算时全投单一广告的问题
我明白你现在遇到的困扰了——当用线性规划优化广告预算时,因为线性目标函数的最优解往往落在约束区域的顶点上,所以会出现把全部预算投给单一广告的情况。要解决这个问题,我们只需要给两类广告添加最小投放金额的约束,确保每类广告都有至少一点预算投入。
问题根源分析
你的现有代码已经完成了线性回归拟合和基础的预算约束,但约束条件只有总预算的上下限。线性规划在这种情况下,会直接选择单位回报率更高的广告(也就是回归系数更大的那个)把预算全投进去——这是线性目标函数在凸约束集上的固有特性,最优解必然出现在顶点。
解决方案:添加非零投放约束
我们需要在原有的约束基础上,新增两个条件:
ads ≥ 最小投放金额(比如设为1美元,你可以根据实际需求调整)ads2 ≥ 最小投放金额
这样就能强制两类广告都获得预算,同时保持总预算在250-300美元的范围内。
修改后的完整代码
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 # 目标函数:最大化销售额,对应ads和ads2的回归系数 obj <- coef[2:3] # 构建约束矩阵: # 行1: ads + ads2 ≥ 250(总预算下限) # 行2: ads + ads2 ≤ 300(总预算上限) # 行3: ads ≥ 1(强制ads非零投放) # 行4: ads2 ≥ 1(强制ads2非零投放) const <- matrix( c(1, 1, # 总预算下限 1, 1, # 总预算上限 1, 0, # ads最小投放约束 0, 1), # ads2最小投放约束 nrow = 4, byrow = TRUE ) # 约束右侧的数值 rhs <- c(250, 300, 1, 1) # 约束方向:≥, ≤, ≥, ≥ direction <- c(">", "<", ">", ">") # 求解线性规划问题 optimum <- lp(direction = "max", objective.in = obj, const.mat = const, const.dir = direction, const.rhs = rhs) # 输出结果 cat("优化后的广告投放金额(ads, ads2):", optimum$solution, "\n") cat("预测销售额:", optimum$objval + coef[1], "\n")
代码说明
- 新增的两行约束分别强制
ads和ads2的投放金额至少为1美元,你可以根据业务需求把这个最小值调整为5、10等任意合理数值。 - 对应的
rhs(约束右侧值)和direction(约束方向)也同步扩展,确保新约束生效。
运行这段代码后,你会得到一个两类广告金额均不为0的最优解,比如类似120 180这样符合预算约束的组合,不会再出现全投单一广告的情况。
内容的提问来源于stack exchange,提问作者kkz
相关产品推荐
相关产品推荐

