5

c# でイベント パブリッシャーを使用して、多数のサブスクライバーにグローバル リソースを提供するという問題が発生しました。資源はライバル財であるため、すべての消費者に十分な量がない可能性があります。

想像するモデルは、市場に到着する食材の出荷です。多くのシェフが各食材を待っており、それぞれが提供されるたびに、それぞれを購入するかどうかを決定する必要があります. シェフたちは、誰もがそれぞれの食材を試してみる必要があることに同意し、各アイテムの競争を望んでいないため、ある種の優先順位システムが存在する必要があると判断しました.

1) この種のシナリオに名前はありますか?

2)これを公正に実装して、各加入者が原料を入手する機会を均等にするための良い方法は何ですか? リソースを要求するかどうかの決定は、サブスクライバーに依存することに注意してください。

3) 優先度は固定優先度を必要としないことに注意してください。各イベントの前にサイコロを振る場合は、毎回注文を作成できます。これを事前に計算することもできます。このようなソリューションに欠点はありますか?

とにかく、これは宿題の質問ではありません。誰かがこれを見たことがあるのか​​ 、それとも一般的な解決策をこれを解決する形にキャストできるのか疑問に思っています.

4

3 に答える 3

2

1) この種のシナリオに名前はありますか?

はい、ラウンドロビンと呼ばれます(正しく取得した場合)

2) これを公正に実装して、各加入者が原料を入手する機会を均等にするための良い方法は何ですか?

システムが複雑になればなるほど、ソリューションを簡単に作成できるようになります。KISSはここで非常にうまく機能します。ラウンドロビン アルゴリズムを実装します。

3) 優先度は固定優先度を必要としないことに注意してください。各イベントの前にサイコロを振る場合は、毎回注文を作成できます。これを再計算することもできます。このようなソリューションに欠点はありますか?

この問題は、大規模なスケーラブルなシステムとネットワークで長年にわたって発生しています (たとえば、このスレッドを参照してください)。人々は多くのことを試しましたが、自分が何をしているのか本当によくわかっていない限り、ラウンドごとに 1 回ずつ行う単純な戦略を使用してください。

ラウンド ロビンは完璧ではなく、間違いなく独自の欠点がありますが、最も簡単なソリューションでもあります。

于 2012-08-28T16:23:45.393 に答える
2

一種のドラフトシステムのように聞こえます。リソースが完全に活用されるまで、事前に決められた順序で、すべてのサブスクライバにリソースの受諾または拒否の権利が与えられます。その順番をどう決めるかがコツです。

これが私のプロジェクトだったら、シンプルに始めると思います。サブスクライブした最初のサブスクライバーから始めて、リソースが完全に活用されるまで、この順序でリストを進めます。次に、追加のリソースが利用可能になると、(リソースが不足したために) 選択できなかった最初のサブスクライバーが最初の拒否の権利を得て、そこから続行します。終わりに達したら、一周して最初に戻ります。これは、大量のリソースのバッチがあり、それぞれを回るには十分でない場合に使用するのに適したモデルです。シェフの食材モデルは、このシステムでうまく機能します。その日に最初に現れたシェフが最初のピックを獲得し、キッチンの周りなどで、シェフが取り残されても心配する必要はありません。

別の可能な方法は、順序に依存しません。すべてのサブスクライバーに、特定のリソースが必要かどうかを尋ねます。利用可能なリソースよりもそれを望んでいる人が多い場合は、すべての購読者の名前を帽子に入れ、X 人を選択します。彼らはリソースを取得します。リソースを取得できなかった人は、その名前をその帽子に保持するため、次のリソースを取得する追加の機会が与えられます. これは、リソースのバッチが小さく、ほとんどまたはすべてが非常に望ましい場合に使用するのに適したモデルであり、最後のサブスクライバーが何か良いチャンスを得るために永遠に待たなければならないことを回避します。WoW 戦利品システムは、おそらくこのように機能します (すべてのパーティー メンバーが各アイテムを「オプトイン」するという単純化があります。私は WoW をプレイしないので、戦利品システムが機能するのを見たことがありません)。

于 2012-08-28T16:19:12.857 に答える
1

1> このシナリオに名前があるかどうかわかりません

2>公正は非常に主観的です。最適なソリューションを得るには、最適化基準が必要です。あなたは、各サブスクライバーが成分を取得する可能性が等しいとおっしゃいました。次に、どれを取得するかを決定するために一様確率変数が必要です。

しかし、シェフは特定の食材を必要としないかもしれないとも言いました。そのため、現在の食材を必要とするシェフのみを考慮に入れる必要があります。したがって、現在の食材を必要とするすべてのシェフ間の公平性を考慮した加重配分が必要です。

これは次のように行うことができます

X人のシェフがいると仮定します

すべてのシェフはゼロ点から始めます。

シェフがリソースを取得するたびに、X ポイントを取得します。リソースを取得していないすべてのシェフは、-1 ポイントを取得します。ポイントが高いほど、最近の履歴で取得したリソースが多くなります。理想的には、リソースはポイントが最も少ない人に与えられるべきです。

最小ポイントで複数の人がいる場合は、ランダムな一様分布を使用して 1 つを選択するだけです。これはある意味公平でしょう。

別のオプションは、すべてのシェフがリソースを取得できるようにすることですが、リソースを必要とするシェフのポイントの合計から計算される分布を使用することです。これにより、リソースを必要とするシェフとリソースを取得する際の現在の履歴によって決定された分布でランダムになります。

于 2012-08-28T16:27:39.397 に答える