在广告投放系统中,广告通常分为保量交付广告(Guaranteed Delivery,GD,合约广告)和不保量交付(Non-Guaranteed Delivery,NGD,竞价广告)两种。合约广告是提前签好合约的,需要将广告投放给特定人群,投放到期如果投放量不足时会有赔偿。对于这个问题,就需要确定针对不同投放约束的客户,如何分配流量,才能使得收益最大,所以这个问题,本质上是流量分配问题。
1 流量分配问题抽象
流量分配问题,可简化为二部图(bipartite graph),如下图所示, ○ ○ ○ 表示流量供给方的数据节点(不同的人群定向下的流量库存), □ □ □ 表示流量需求方节点(期望广告投放的特性人群定向的需求),两者之间会有很多的连线,每一条连线都代表供给方节点能支持需求方的定向需求,但不一定会分配。
![](https://img-blog.csdnimg.cn/20200816093221304.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NqcWhfaGFv,size_16,color_FFFFFF,t_70#pic_center)
2 HWM算法
HWM,即 High Water Mark Algorithm,HWM通过简单的启发算法解决库存分配的问题,算法主要思想是:首先考虑能满足合约的所有流量,流量越少重要程度越高更靠前,即更需要提前考虑,然后将流量按照所需量平分,转换为概率。
算法核心步骤如下:
step 1
初始化每个节点的剩余供给量
r
i
=
s
i
r_i=s_i
ri=si
step 2
计算所有符合约定投放量
d
j
d_j
dj定向约束的供给流量和
S
j
Sj
Sj
S j = ∑ i ∈ Γ ( j ) n ( s i ) ( 1 ) S_j=\sum_{i\in\Gamma(j)}^{n} (s_i) (1) Sj=i∈Γ(j)∑n(si)(1)
其中
s
i
s_i
si:为第i节点预估库存量
S
j
S_j
Sj:为满足
j
j
j定向条件的全部节点库存总量
根据公式(1)计算得
200k(Male):
S
1
=
400
+
400
+
100
=
900
S_1=400+400+100=900
S1=400+400+100=900
200k(CA):
S
2
=
100
+
100
=
200
S_2=100+100=200
S2=100+100=200
1M(Age=5):
S
3
=
400
+
400
+
100
+
100
+
500
+
300
=
1800
S_3=400+400+100+100+500+300=1800
S3=400+400+100+100+500+300=1800
通过计算得出排序: S 2 S_2 S2, S 1 S_1 S1, S 3 S_3 S3,即优先分配可分流量少的广告
step 3
根据①计算的顺序2,1,3,依序计算各个合约的供给比例
∑ i ∈ Γ ( j ) n m i n ( r i , s i a j ) = d j ( 2 ) \sum_{i\in\Gamma(j)}^{n} min(r_i,s_ia_j)=dj(2) i∈Γ(j)∑nmin(ri,siaj)=dj(2)
其中:
Γ
(
j
)
\Gamma(j)
Γ(j):为满足合约
j
j
j定向条件的所有人群集合
d
j
d_j
dj:为合约
j
j
j的需求投放量
根据公式(2)计算:
对于2:
200
=
m
i
n
(
100
,
100
a
j
)
+
m
i
n
(
100
,
100
a
j
)
200=min(100,100a_j)+min(100,100a_j)
200=min(100,100aj)+min(100,100aj)
a
j
=
1
a_j=1
aj=1
对于1:
200
=
m
i
n
(
400
,
400
a
j
)
+
m
i
n
(
400
,
400
a
j
)
+
m
i
n
(
0
,
100
a
j
)
200=min(400,400a_j)+min(400,400a_j)+min(0,100a_j)
200=min(400,400aj)+min(400,400aj)+min(0,100aj)
a
j
=
1
4
a_j=\frac{1}{4}
aj=41
对于3:
1000
=
m
i
n
(
300
,
400
a
j
)
+
m
i
n
(
300
,
400
a
j
)
+
m
i
n
(
0
,
100
a
j
)
+
m
i
n
(
0
,
100
a
j
)
+
m
i
n
(
500
,
500
a
j
)
+
m
i
n
(
300
,
300
a
j
)
1000=min(300,400a_j)+min(300,400a_j)+min(0,100a_j)+min(0,100a_j)+min(500,500a_j)+min(300,300a_j)
1000=min(300,400aj)+min(300,400aj)+min(0,100aj)+min(0,100aj)+min(500,500aj)+min(300,300aj)
a
j
=
5
8
a_j=\frac{5}{8}
aj=85
注:如果无解,则 a j = 1 a_j=1 aj=1
计算每个预约投放量的同时,要更新供给节点剩余量
r
i
=
r
i
−
m
i
n
(
r
i
,
s
i
α
j
)
r_i = r_i − min(r_i, s_iα_j)
ri=ri−min(ri,siαj)
这样,就可以按照对应比例进行流量分配,且能够保证不同人群定向的投放量。
注:该二部图并不是严格意义上的供给最小互斥散列集合
![](https://img-blog.csdnimg.cn/20200816102009957.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NqcWhfaGFv,size_16,color_FFFFFF,t_70#pic_center)
如上图,这是严格的最小互斥散列供给节点,该图参考【HWM在线分配算法】
参考文档
1 HWM算法论文,google学术下载
2 https://chierqj.github.io/hwm-zai-xian-fen-pei-suan-fa/