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