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

为什么要匀速投放?

  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;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值