列生成算法在广告投放优化问题中的应用示例
问题描述
假设一家广告公司要为多个客户在多个广告位上进行投放优化。每个广告位有固定的展示次数(库存),每个客户有不同的广告系列(campaign),每个系列有最低展示量要求、目标受众和出价。目标是最大化总广告收入,同时满足库存约束和客户要求。
具体数学模型:
- 设广告位集合为 \(I\),每个广告位 \(i \in I\) 的库存为 \(S_i\)
- 客户广告系列集合为 \(J\),每个系列 \(j \in J\) 需至少展示 \(D_j\) 次,出价为 \(p_j\)(每展示收入)
- 决策变量 \(x_j\) 表示分配给系列 \(j\) 的展示总次数
- 约束:每个广告位 \(i\) 分配给所有系列的总展示次数不超过 \(S_i\),且 \(x_j \geq D_j\)
关键难点
直接建模需定义变量 \(x_{ij}\)(广告位 \(i\) 分给系列 \(j\) 的展示次数),但广告位和系列数量大时,变量规模爆炸。列生成通过动态生成“分配模式”来高效求解。
列生成建模过程
- 主问题(Master Problem, MP)
- 定义“分配模式”:每个模式 \(k\) 对应一个广告位 \(i\) 的可行分配方案,即一个向量 \(a_{jk}\) 表示该模式下分给系列 \(j\) 的展示次数。
- 设模式 \(k\) 的使用次数为 \(\lambda_k\),其收入为 \(\sum_j p_j a_{jk}\)
- MP 模型:
\[ \max \sum_k \left( \sum_j p_j a_{jk} \right) \lambda_k \]
\[ \text{s.t.} \quad \sum_k \lambda_k \leq S_i \quad (\forall i \in I) \quad \text{(每个广告位库存约束)} \]
\[ \sum_k a_{jk} \lambda_k \geq D_j \quad (\forall j \in J) \quad \text{(系列最低展示量)} \]
\[ \lambda_k \geq 0 \]
-
限制主问题(RMP)
- 初始仅包含少数模式(如每个广告位单独分配一个系列),求解 RMP 得到对偶变量 \(\mu_i\)(对应库存约束)和 \(\pi_j\)(对应展示量约束)。
-
子问题(Pricing Problem)
- 对每个广告位 \(i\),生成新模式 \(k\) 的检验数为:
\[ \text{Reduced Cost} = \sum_j p_j a_j - \mu_i - \sum_j \pi_j a_j \]
其中 $ a_j $ 为新模式中分给系列 $ j $ 的展示次数。
- 子问题目标:最大化 \(\sum_j (p_j - \pi_j) a_j\),约束为 \(\sum_j a_j \leq S_i\) 和 \(a_j \geq 0\)。
- 此问题实质是单广告位上的背包问题:选择系列分配展示次数以最大化净收益。
迭代求解步骤
-
初始化
- 为每个广告位创建一个简单模式(如全部分配给出价最高的系列),加入 RMP。
-
循环迭代
- 步骤1:求解当前 RMP,得到对偶变量 \(\mu_i, \pi_j\)。
- 步骤2:对每个广告位 \(i\),求解子问题:
\[ \max \sum_j (p_j - \pi_j) a_j, \quad \text{s.t.} \quad \sum_j a_j \leq S_i, \quad a_j \geq 0 \]
若最优值 $ > \mu_i $,则新模式可加入 RMP。
- 步骤3:若无新模式可改善目标值,当前解即最优;否则将新模式加入 RMP,重复步骤1。
- 终止条件
- 所有广告位的子问题 reduced cost 均非正,说明无改进空间。
实例演示
假设:
- 广告位1库存 \(S_1 = 1000\),广告位2库存 \(S_2 = 1500\)
- 系列A:出价 \(p_A=5\),要求 \(D_A=800\);系列B:出价 \(p_B=3\),要求 \(D_B=1000\)
迭代1:
- 初始模式:广告位1全分给A(收入5000),广告位2全分给B(收入4500)
- 求解 RMP 得 \(\pi_A=5, \pi_B=3\)(对偶变量)
- 子问题:对广告位1,计算 \((p_A-\pi_A)=0, (p_B-\pi_B)=0\),无改善;同理广告位2无改善。
- 但当前解不满足系列B展示量要求(仅1500<1000? 需检查约束)。
迭代修正:
- 调整初始模式,加入满足下限的可行解后重新计算对偶变量,再通过子问题生成更优模式(如混合分配A和B)。
- 最终生成模式可能如:广告位1分600次给A、400次给B,广告位2分200次给A、1300次给B,以满足需求并最大化收入。
关键点总结
- 列生成将大规模问题分解为“主问题+子问题”,通过动态生成列(模式)避免枚举所有变量。
- 子问题的效率至关重要:本例中为背包问题,可用贪心或动态规划快速求解。
- 广告投放场景中,列生成可轻松扩展至多广告位、多受众定向等复杂约束。