2009-11-09 14 views
8

私は、夜間にデータを送受信することで、3つのタイムゾーンにまたがる多くのデバイスに対応する環境を持っています。これらの装置の分布は、識別番号とモジュロ演算を用いた簡単な計算に基づいて擬似ランダムに決定された。このような計算の結果、夜間の特定の時間帯に必要なリソースよりも多くのリソースを消費する不要な人工的なピークが生成されます。時間の経過と共にピーク使用量を平坦化するアルゴリズム?

私たちのプロトコルの一部として、後日にシステムに接続するときにデバイスに指示することができます。

私は一般にピークをよりレベルの高いラインに(一般的にはより高い頻度ではあるが)、または少なくとも正しい方向に押し込むことができるアルゴリズムを探している。 。私は、デバイスの識別番号、現在の時刻、およびデバイスのタイムゾーンを計算を実行するための入力として利用できます。私は、このアプローチが私が望んでいるよりもあまり優雅ではないかもしれないと感じていますが(学習アルゴリズムは悪いことではないかもしれませんが...)、スロットを描画するためのプールを作成するためにいくつかの前向き分析計算を実行することもできます。

(私はC#を使用して、このアルゴリズムを実装します最終的には、やや少ない関連する。)

+0

私は完全に明確な問題の説明を見つけることができません:

ここでどのように実装するための様々な機能のいくつかのより具体的な情報ですか?私たちは何を配布していますか?どのように(多かれ少なかれ)ランダムな分布が、どのようにして重要なピークになるか?代わりに配布が簡単なラウンドロビンだったらどうなりますか? – djna

+0

ピークは、時間帯とモジュロ操作のために人為的に作成されます。 – cfeduke

答えて

12

ランダム時間の使用に関連するスパイクを避けたい場合は、ハッシュテーブルに使用されるさまざまなハッシュ関数を見てください。 、基本的に

http://en.wikipedia.org/wiki/Hash_function

あなたのアップデートウィンドウがバケツの適切な数になりたいものは何でも分割:あなたの読書は、件名にWikipediaの記事で開始される可能性があります。 1つのオプションは、3時間* 60分* 60秒= 10800バケットの場合があります。次に、選択したハッシュ関数に対してハッシュテーブルサイズとして使用します。固有の入力はデバイスIDです。選択した時間にGMTを使用することを忘れないでください。お使いのプログラミング言語には、ハッシュ関数が組み込まれているのが一般的ですが、最初から実装したい場合は、記事にいくつかのリンクが必要です。

このアプローチは、より良い均一性プロパティがあるため、ランダムアクセス時間の以前の回答よりも優れています。また、は、アクセスパターンが時々スパイクを呈する可能性があるランダム関数。

http://www.partow.net/programming/hashfunctions/index.html

2

あなたが接続するために何時間デバイスを伝えることができるので、あなたがランダムまたはmodulused何かを必要とする理由私は見ていないと言います。各デバイスが接続すると、現在割り当てられているデバイスが多くない明日の時間を選択し、その時間にデバイスを割り当てます。デバイスがすべて同じ量のリソースを使用してサービスする場合、些細なグリーディ・アルゴリズムでは完全にスムーズな配信が行われ、現在最も混雑していない時間帯に各デバイスを割り当てます。サーバーがこれらのデバイスだけでなく他の作業を処理している場合は、典型的な負荷プロファイルから始め、そのデバイス負荷をそのデバイスに追加したいと考えています。私は実際にこの「分析的計算」と呼ばず、次の24時間の時間に対する期待負荷のヒストグラムを保存するだけです。

または、デバイスが指示に従わない可能性があります(たとえば、割り当てられた時間にオフラインになり、次にオンになるたびに接続するなど)。明らかに、特定のタイムゾーンのユーザーがすべて朝から同じ時間に作業を開始すると、それは問題のある戦略になります。

+0

これには、フィードバックループコンポーネントが含まれているという問題があります。最初の夜に2amが最もビジーでない場合は、2amにリソースを割り当てます。それは、偶発的なトラフィックが最初の夜に無作為に割り当てられた場合、最も忙しい2時になるため、午前2時からすべてをスケジュールし、午前2時頃の使用を非効率的にします。 偶発的なトラフィックの安定した配信が得られない限り、間隔をまたいで一様な割り当てが常に最適になります。 – groundhog

+0

現在、最も忙しい時間が1時間(例えば150万ヒット)、最も忙しい2時間(たとえば50万ヒット)の場合、私の提案は1人の午前5時間を午前2時に命じることです。これにフィードバックループがどのようにあるのか分かりません。整数を含むバケットの配列を保持してください。「明日この時間にどのくらいのヒットがスケジューリングされますか?」というバケットを一様に埋めます。あなたが間違ったアルゴリズムを使っていない限り、過補償はありません。 "明日この時間にどのくらいのヒットが予定されていますか?私は他の時間から既に移動したヒットを含まない*"。そうしないでください。 –

1

デバイスの数をとって、時間間隔をn個の等しいセグメントに分割し、各セグメントをデバイスに割り当て、次に接続するときに接続するタイミングを通知するだけです。

これにより、すべてのケースで最適な均一分布が得られます。

GMTに常時正規化します。タイムゾーンや昼間の節約などについて気になりますか?今すぐあなたがいる時間帯に関係なく今です。

ランダムな分布を追加すると、一様分布が均一になります(ただし、一様分布は一様であり、必ずしも特定のサンプルではありません)。フィードバックメカニズムがない場合に使用されます。あなたがランダムなコンポーネントに接続するときにあなたはある程度まで制御することができるので、すべてが必要ではなく、遠隔的に最適でもありません。

デバイス間のクロックドリフトが懸念される場合は、ランダム性を追加しても、クロックドリフトのランダム性が低下することはなく、さらに最適化されない割り当てにのみ寄与します。

地域ごとにデバイスを安定して配信する場合は、地域ごとのデバイスの比率を計算し、スロットの割り当てを適切に分散します。たとえば、タイムゾーンごとに50/25/25がある場合は、スロットを最初のタイムゾーンに割り当て、次に2つのスロットを残りのタイムゾーンに割り当ててから、繰り返します。

関連する問題