1

我希望在网站上轮换广告,但我想提出一个考虑以下因素的公式:

  • 时间戳(最近创建的广告应该具有高优先级)
  • 展示次数(观看次数较少的广告应具有高优先级)。理想情况下,我想为每个广告设置每月展示次数的配额。
  • 一个权重(那些权重高的广告应该有高优先级)

最后,我想谈谈如何随机化结果。将这些因素纳入 PHP 脚本或 mysql 查询的最佳方法是什么?到目前为止,我已经尝试过这样的查询:

$result = mysql_query ("SELECT * FROM banner_ads  WHERE usedImpressions/totalImpressions < $threshold OR usedImpressions = 0 ORDER BY RAND() LIMIT 1");

但是当然这里最大的限制是阈值应该是一个好的值,并且它仍然没有考虑创建它的权重或时间戳。

4

1 回答 1

2

不确定您是否只要求查询,但伪代码/数学解决方案是:

首先计算每个广告的权重:

 CurrentWeight = BaseWeight 
               + AdPriority 
               - Impressions*ImpressionWeight 
               - (CurrentDate-CreateDate)*DateWeight;

然后,您的每个广告都将有一定的被选中机会的百分比:

 PerAdPercentage = CurrentWeight / Sum(allCurrentWeightsAllAds)

使用该百分比为每个广告分配一组数字(例如 0-100)。现在使用随机数生成器在该范围内选择一个数字并选择获胜者。

要处理配额:

  1. 从搜索中包含的当前广告列表中删除它,或者,
  2. 如果超过配额,则添加另一个权重以大幅折扣。

我还添加了一个值,以优先考虑离配额最远的广告。

回复:您的评论:

当前权重应该计算出所有您想要关注的关于您展示广告的频率的所有因素。然后将计算的权重相互比较,以确定每个广告的相对优先级。当每个广告都有一组取决于其相对权重的数字时,您会更频繁地点击权重较高的广告而不是权重较小的广告。

ImpressionWeight 和 DateWeight 是您用来平衡/调整等式以将适当的值计入您的体重的任意数字 - 基本上将数字标准化。(例如,假设您以毫秒为单位进行日期数学运算并获得大量数字,但您的 AdPriority 使用 1-10 - 如果在不加权日期值的情况下组合这些数字以使其也成为非常小的数字,则这些数字毫无意义)

最后,您可能需要考虑可以从总体权重中减去日期和展示次数的最大值,因为您可能不希望将百分比/权重设为零。对于日期,您可能需要非线性衰减的东西。

于 2013-09-05T16:48:29.817 回答