行業背景
智能推送是可以基于用戶行為和興趣的個性化內容進行推送。是通過分析用戶的歷史行為、關注點和偏好,智能推送系統可以提供給用戶最相關、有價值的信息、產品或服務。這個優化問題也可以通過數學規劃的方法進行建模和求解。
例如:在很多視頻在線流量調控場景,需要在保證每個視頻內容播放量的同時,使得播放總量最大化。這種場景可以包括廣告、通知、宣發內容推送等各種類型。而線上流量是有限的,且不同的宣發內容對用戶的吸引力均不相同。
業務調研、數據量化、數學建模
在使用優化技術的時候,需要更詳細的調研業務的需求,整理相關的業務邏輯和數據,并量化表示它。然后采用數學規劃的方法進行數學建模。
此部分細節較多,可在案例視頻流量調控中查閱細節,此處我們僅列出數學公式如下,參數部分請點擊案例鏈接查看:
其中i為視頻內容、u為用戶群、CTR為預估點擊率、VV為內容的播放量保量值。
以上公式對應的約束有:
保證視頻的播放總量在范圍內
保證每個用戶都有視頻可以看
源代碼
MindOpt支持多種編程語言或者建模語言來調用。此處僅列出一種供參考:
MindOpt APL建模語言調用
MindOpt APL建模語言的源代碼(可在視頻流量調控上試運行):
##====MindOpt APL 建模語言版本代碼====
# LP_4_distribution.mapl
# 聲明集合
set USERS := { "user0", "user1" };
set ITEMS := {"item0", "item1", "item2"};
set RANGE := { "lower" };
# 聲明參數
param CTR[ITEMS * USERS] :=
| "user0" , "user1" |
|"item0" | 0.52 , 0.92 |
|"item1" | 0.31 , 0.93 |
|"item2" | 0.82 , 0.91 |;
param Broadcast_Num_Range[RANGE * ITEMS] :=
|"item0","item1", "item2"|
|"lower" | 0 ,0 , 1 |;
# 聲明變量
var X_Probability[USERS * ITEMS] >= 0;
# 聲明目標
maximize Total_CTR_Reward: sum {<u, i> in USERS * ITEMS} CTR[i, u] * X_Probability[u, i];
# 聲明約束
subto Each_Item_Broadcast_In_Range: #視頻的播放量在范圍內
forall {<i> in ITEMS }
sum {<u> in USERS} CTR[i, u] * X_Probability[u, i] >= Broadcast_Num_Range["lower",i];
subto Each_User_Total_X_Probability: #每個用戶總有視頻看
forall {<u> in USERS}
sum {<i> in ITEMS} X_Probability[u, i] == 1;
#--------------------------
print "-----------------用MindOpt求解---------------";
option solver mindopt; # (可選)指定求解用的求解器,默認是MindOpt
solve; # 求解
print "-----------------Display---------------";
display; # 展示結果
print "目標函數總收益是:", sum {<u, i> in USERS * ITEMS} CTR[i, u] * X_Probability[u, i];
結果和結果用法
不同代碼日志打印不一樣。部分結果日志打印如下所示:
...
Model summary.
- Num. variables : 6
- Num. constraints : 5
- Num. nonzeros : 12
- Bound range : [1.0e+00,1.0e+00]
- Objective range : [3.1e-01,9.3e-01]
- Matrix range : [3.1e-01,1.0e+00]
...
Simplex method terminated. Time : 0.002s
OPTIMAL; objective 1.75
...
-----------------結果---------------
目標函數總收益是:1.746043956043956
目標的最優解是:1.75。更多解的細節,如決策變量的取值、驗證約束是否正確,可以通過print命令打印來顯示,變量的取值也可以從程序運行寫的.sol文件里面獲取,還可以調用display
獲取所有變量的。
如運行如下指令,驗證“保證視頻的播放總量在范圍內”這個約束:
forall {<i> in ITEMS }
print ' 保量要求lb為{},優化計算后預估點擊量{}為{}'%Broadcast_Num_Range['lower',i],i,sum {<u> in USERS} CTR[i, u] * X_Probability[u, i],
sum {<u> in USERS} CTR[i, u] * X_Probability[u, i];
驗證結果:
保量要求lb為0,優化計算后預估點擊量item0為0
保量要求lb為0,優化計算后預估點擊量item1為0.746043956043956
保量要求lb為1,優化計算后預估點擊量item2為1
運行如下代碼,將輸出打印為csv格式,作為廣告流量分發問題的解決方案:
print "{}, {}, {}" % "視頻", "用戶", "播放概率" : "Solution.csv";
close "Solution.csv";
forall {<i,u> in ITEMS*USERS}
print "{}, {}, {}" % u, i, X_Probability[u, i] >> "Solution.csv";
close "Solution.csv";
結果如下:
即,將第2號視頻播放給第0號用戶的概率為1,
將第1號視頻播放給第1號用戶的概率為0.8,
將第2號視頻播放給第1號用戶的概率為0.2。