在广告投放系统中,广告通常分为保量交付广告(Guaranteed Delivery,GD,合约广告)和不保量交付(Non-Guaranteed Delivery,NGD,竞价广告)两种。合约广告是提前签好合约的,需要将广告投放给特定人群,投放到期如果投放量不足时会有赔偿。对于这个问题,就需要确定针对不同投放约束的客户,如何分配流量,才能使得收益最大,所以这个问题,本质上是流量分配问题。
1 流量分配问题抽象
流量分配问题,可简化为二部图(bipartite graph),如下图所示, ○ ○ ○ 表示流量供给方的数据节点(不同的人群定向下的流量库存), □ □ □ 表示流量需求方节点(期望广告投放的特性人群定向的需求),两者之间会有很多的连线,每一条连线都代表供给方节点能支持需求方的定向需求,但不一定会分配。
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)
这样,就可以按照对应比例进行流量分配,且能够保证不同人群定向的投放量。
注:该二部图并不是严格意义上的供给最小互斥散列集合
如上图,这是严格的最小互斥散列供给节点,该图参考【HWM在线分配算法】
参考文档
1 HWM算法论文,google学术下载
2 https://chierqj.github.io/hwm-zai-xian-fen-pei-suan-fa/

















