1

サイトで広告をローテーションしようとしていますが、次のことを考慮した式を考え出そうとしています:

  • タイムスタンプ (最近作成された広告ほど優先度が高くなります)
  • インプレッション数 (ビュー数が少ない広告の優先度を高くする必要があります)。理想的には、すべての広告の 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. 割り当てを超える場合は、別の重みを追加して大幅に割引します。

また、クォータから最も遠い広告を優先する値も追加します。

Re: あなたのコメント:

現在の重みは、広告を表示する頻度について重要なことをすべて計算する必要があります。次に、計算された重みを相互に比較して、各広告の相対的な優先度を決定します。各広告に相対的な重み付けに応じた数字のブロックがある場合、重み付けが小さいものよりも重み付けが高い広告にヒットする頻度が高くなります。

ImpressionWeight と DateWeight は、方程式のバランス/調整に使用する任意の数値であり、体重に適切な値を考慮に入れます - 基本的に数値を正規化します。(たとえば、ミリ秒単位で日付計算を行って膨大な数を取得するとしますが、AdPriority には 1 ~ 10 を使用します。これらの数値は、日付値を重み付けして非常に小さな数値にすることなく組み合わせても意味がありません)

最後に、パーセンテージ/加重をゼロにしたくない可能性が高いため、日付とインプレッションが全体の加重から差し引くことができる最大値を考慮する必要があります。日付の場合、非線形に減衰するものが必要になる場合があります。

于 2013-09-05T16:48:29.817 に答える