Python求最优解:营销推广预算分配方案


项目来源于网络

业务背景:

帮助营销部门制定推广预算分配方案。本月共有1000万元推广预算,营销人员需将其分配到各个渠道和品类。
给出各渠道品类过去的ROI数据,如何确认分配比例,可以使这1000万元预算的推广效果达到最大化。

已知情况:

1.主要渠道有4个,分别是某电商网站,某音,某度和线下。
2.要求 电商网站投入预算不能少于100万元,该渠道过去的投入产出比(ROI)是1.5;某音预算不能多于300万元,ROI=2;某度预算不能少于200万,ROI=0.7;线下预算不能少于100万,ROI=0.1。

3.商品共有5个品类,分别是服装,家电,百货,美妆和餐饮。
4.服装类投入预算不能少于100万元,ROI=1.2;家电类不能多于300万元,ROI=2;百货类不能少于100万元,ROI=1.4,;美妆类不能多于350万元,ROI=1.5,;餐饮类不能少于50万元,ROI=0.8。

分析思路

这是一个线性规划问题,其实就是一组一次方程求最优解,指标也很简单,就是推广效益,假设为 z ,则 z = 投入预算ROI
只是涉及到的变量比较多显得式子很乱很麻烦,最终的方案应该是取得不同品类
不同渠道的最优解

1.先简单看下渠道和品类的分配最优解
假设x_i为渠道方面投入,y_i为品类。
整理后得到如下方程:

  1. 品类渠道的最优解,即明确各品类在各渠道的投放预算,那么假设abcde为品类代号,1234为渠道代号,
    则a1即为服装类在电商网站的广告投入预算,效益 z = 1.2
    a11.5 = 1.8a1,b2为家电类在某音的广告投入预算,效益 z = 2b2*2 =4b2
    整理后得到如下方程:

代码、计算

使用scipy库的linprog()函数,linprog函数一般用来求解线性规划问题,寻找目标函数的最小值,而现在要求的是最大值,只要加上负号即可。

函数需要的几个参数解释
linprog(c,A_ub=None,b_ub=None,A_eq=None,b_eq=None,bounds=None,method='interior-point',callback=None,options=None)

c是线性目标函数系数,我们的目标函数是z=roi*投入预算,则c即roi,写作列表[-1.5,-2,-0.7,-001]
A_ub,官方解释叫不等式约束矩阵,在Aub的每一行指定x(这个x是指方程未知数的意思)上的线性不等式约束的系数,如果我们方程是x_1+x_2+x_3+x_4<1000,就是里面x_i的系数,即为[1,1,1,1],数据类型是二维数组
b_ub,官方解释叫不等式约束向量,每个元素代表A_ub x的上限,就是x_1+x_2+x_3+x_4<1000里的1000,数据类型是一维数组
A_eq和b_eq同上解释,叫等式约束xx,都是可选参数,根据实际情况决定,依据我们这里的需要,只写A_eq和b_eq就行了
bounds,官方解释叫定义决策变量x的最小值和最大值,就是范围约束,即x_1≥100,x_2≤300,x_3≥200,x_4≥100,写作x_1=(100,1000)
method,官方解释是算法,提供{‘interior-point’, ‘revised simplex’, ‘simplex’}三种算法可选,具体不是很理解,反正是可选参数,一般忽略不写
callback,调用回调函数,也不是很理解,不写哈哈哈,还有options(求解器选项字典)也不写

具体代码实现

这里遇到个问题,因为品类渠道的A_eq矩阵是奇异矩阵(20列9行),虽然能出结果但不是最优的,经过各种百度最后找到原因是被函数判断成冗余了,
具体是因为啥我也解释不来,反正得在最后把options这个参数给加上,具体请参考这里~



免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM