欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

聊聊广告系统里的匀速投放

程序员文章站 2022-06-12 13:44:16
...

为什么要匀速投放?

  1. 广告计划预算有限
  2. 匀速投放可以在一定程度上确保广告计划触及范围更广的人群

如何实现匀速投放?

  • 按小时平均。根据日预算和投放时段算出小时预算:小时预算=日预算/投放时段

匀速投放的问题?

  • 预算消耗不完。流量有高峰有低谷,如果某个时段的流量无法承载日预算就可能出现预算无法消耗掉的情况

如何解决

  • 按剩余平均。我们修改计算小时预算的公式:小时预算=(日预算-已投放时段消耗)/未投放时段

匀速投放中涉及的几个计算值

  • 日预算
  • 投放时段
  • 已投放时段消耗
  • 小时预算
  • 小时消耗

代码实现

public class AdPlanInfo {
    /**
     * 广告计划ID
     */
    private Integer planId;
    /**
     * 投放时间段
     */
    private int[] periods;
    /**
     * 日预算
     */
    private int dailyBudget;

}
    public boolean filter(AdPlanInfo adPlanInfo) {
        // 获取当前投放时段
        Calendar calendar = Calendar.getInstance();
        int currHour = calendar.get(Calendar.HOUR_OF_DAY);

        // 获取当日总消耗
        int dailyConsumed = getDailyConsumed();
        // 获取小时消耗
        int hourConsumed = getHourConsumed(currHour);
        // 计算小时预算
        int hourBudget = computeHourBudget(currHour, adPlanInfo, dailyConsumed - hourConsumed);
        if (hourConsumed >= hourBudget) {
            return true;
        }
        return false;
    }

    private int computeHourBudget(int currHour, AdPlanInfo adPlanInfo, int consumed) {
        int remainingHour = 0;
        int[] periods = adPlanInfo.getPeriods();
        for(int i=0;i<periods.length;i++) {
            if(periods[i]>=currHour) {
                remainingHour++;
            }
        }
        return (adPlanInfo.getDailyBudget() - consumed) / remainingHour;
    }