R语言lpSolve求解含乘法项的销售额最大化定价问题
原代码存在的问题
- 工具选型错误:
lpSolve仅支持求解线性规划问题,要求目标函数、所有约束都是决策变量的线性组合。你给出的销售额预测公式展开后是关于suggested.price的二次函数,属于非线性目标,直接用lpSolve无法求解。 - 模型逻辑错误:整个优化问题的待求解决策变量只有
suggested.price一个,current.price、sales.lastmonth、elasticity都是提前给定的固定参数,你原代码把固定参数作为等式约束写入模型,完全混淆了参数和决策变量的定义。 - 代码语法错误:你直接把未赋值、未定义的
sales.prediction对象传入目标函数参数,运行时会直接触发"找不到对象"的报错,根本没有把目标函数和决策变量关联起来。
正确实现方案
你的销售额公式是单变量二次函数,不需要调用复杂的规划求解包,通过代数推导就能得到和Excel规划求解完全一致的结果:
- 先把公式展开整理,代入固定参数后,销售额是关于建议定价P的开口向下的抛物线,无约束下的最大值出现在抛物线顶点,顶点对应定价公式为:
P_无约束最优 = (current.price * (1 + |elasticity|)) / (2 * |elasticity|)
- 针对V2版本新增的定价浮动约束,先计算可行定价区间:
价格下限 = 基准建议价 * (1 - 25%)
价格上限 = 基准建议价 * (1 + 25%) - 因为目标函数是单峰凹函数,最终最优定价只需要把无约束最优值和区间边界做裁剪即可:无约束最优值落在区间内就取该值,超出区间就取离它最近的区间边界。
可直接运行的代码如下:
# 固定参数赋值 current.price <- 15 sales.lastmonth <- 50 elasticity <- -1.5 base_price <- 12.5 # V2版本定义的非优化基准建议价 float_ratio <- 0.25 # 最高上下浮动25% # 计算无约束最优定价 abs_e <- abs(elasticity) p_opt_noconst <- (current.price * (1 + abs_e)) / (2 * abs_e) # 计算定价可行区间 p_min <- base_price * (1 - float_ratio) p_max <- base_price * (1 + float_ratio) # 施加约束得到最终最优定价 suggested.price <- max(p_min, min(p_opt_noconst, p_max)) # 计算对应最大预测销售额 sales.prediction <- (sales.lastmonth - ((abs_e*(suggested.price - current.price))*(sales.lastmonth/current.price)))*suggested.price # 打印结果 print(paste0("最优建议定价:", round(suggested.price,2))) print(paste0("最大预测销售额:", round(sales.prediction,2)))
运行结果:
[1] "最优建议定价:12.5" [1] "最大预测销售额:781.25"
约束适配说明
如果你的基准建议价发生变化,只需要修改base_price的取值,代码会自动计算新的可行区间并输出最优定价。比如如果基准价设为10,那么可行区间是7.512.5,无约束最优12.5刚好落在区间上限,最终输出定价就是12.5;如果基准价设为16,可行区间是1220,无约束最优12.5在区间内,最终定价还是12.5;如果基准价设为9,可行区间是6.75~11.25,无约束最优12.5超出上限,最终定价就取上限11.25。
内容的提问来源于stack exchange,提问作者Frank Beke
相关产品推荐
相关产品推荐

