行业背景
智能推送是可以基于用户行为和兴趣的个性化内容进行推送。是通过分析用户的历史行为、关注点和偏好,智能推送系统可以提供给用户最相关、有价值的信息、产品或服务。这个优化问题也可以通过数学规划的方法进行建模和求解。
例如:在很多视频在线流量调控场景,需要在保证每个视频内容播放量的同时,使得播放总量最大化。这种场景可以包括广告、通知、宣发内容推送等各种类型。而线上流量是有限的,且不同的宣发内容对用户的吸引力均不相同。
业务调研、数据量化、数学建模
在使用优化技术的时候,需要更详细的调研业务的需求,整理相关的业务逻辑和数据,并量化表示它。然后采用数学规划的方法进行数学建模。
此部分细节较多,可在案例视频流量调控中查阅细节,此处我们仅列出数学公式如下,参数部分请点击案例链接查看:
其中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。
文档内容是否对您有帮助?