0

だから私は新しいヒーローを演じます。私は、5 人のヒーローのチームと別の 5 人のヒーローのチームが最も多く勝ったことを示す統計プログラムを作成したいと考えています。85 人のヒーローがいて、ゲームは 85 人が 5 人を選ぶ対 80 人が 5 人を選ぶということを考えると、それは多くの組み合わせです。

基本的に、ゲームサーバーが取得できる統計データを取得し、ヒーローが勝利したときの配列に 1 を入れるだけです [1,2,3,4,5][6,7,8] ,9,10][W:1][L:0] ゲームの履歴データから配列を解析して構築した後、見たい 5 人のヒーローを入れて、関連するすべてのゲームを取得できます。どの 5 人のヒーロー ラインナップが最も勝ったか負けたかを示すデータ。

最初に助けが必要なのは、配列を書き出すための単純なアルゴリズムです。ここに私が必要とする同様の出力があります: (私はこれを 1-10 に単純化しました。取得したコードは、ヒーローの数に対して 10 を x に変更するだけです)。

[1,2,3,4,5][6,7,8,9,10]

[1,2,3,4,6][5,7,8,9,10]

[1,2,3,4,7][5,6,8,9,10]

[1,2,3,4,8][5,6,7,9,10]

[1,2,3,4,9][5,6,7,8,10]

[1,2,3,4,10][5,6,7,8,9]


[1,2,3,5,6][4,7,8,9,10]

[1,2,3,5,7][4,6,8,9,10]

[1,2,3,5,8][4,6,7,9,10]

[1,2,3,5,9][4,6,7,8,10]

[1,2,3,5,10][4,6,7,8,9]


[1,2,3,6,7][4,5,8,9,10]

[1,2,3,6,8][4,5,7,9,10]

[1,2,3,6,9][4,5,7,8,10]

[1,2,3,6,10][4,5,7,8,9]


[1,2,3,7,8][4,5,6,9,10]

[1,2,3,7,9][4,5,6,8,10]

[1,2,3,7,10][4,5,6,8,9]


[1,2,3,8,9][4,5,6,7,10]

[1,2,3,8,10][4,5,6,7,9]


[1,2,3,9,10][4,5,6,7,8]


[1,2,4,5,6][3,7,8,9,10]

[1,2,4,5,7][3,6,8,9,10]

[1,2,4,5,8][3,6,7,9,10]

[1,2,4,5,9][3,6,7,8,10]

[1,2,4,5,10][3,6,7,8,9]

[1,2,4,6,7][3,5,8,9,10]

[1,2,4,6,8]...

[1,2,4,6,9]

[1,2,4,6,10]

[1,2,4,7,8]

[1,2,4,7,9]

[1,2,4,7,10]

[1,2,4,8,9]

[1,2,4,8,10]

[1,2,4,9,10]

...

あなたはアイデアを得る。繰り返しや順序は関係ありません。本質的に半分にカットされても、配列の順序は関係ありません。互いに対戦できるチームのすべての組み合わせのリストが必要です。

編集:追加の思考...

かなり考えた末。私はいくつかのアイデアを思いつきました。[85*84*83*82*81][80*79*78*77*76*75] の可能な文字の組み合わせの配列全体を書き出す代わりに、新しい配列の関連性を維持し、常に更新するためのヒーロー。

代わりに、サーバーから読み取るときに情報を解析し、そこから配列を構築します。組み合わせが以前にプレイされたことがない場合、配列内の要素が見つからない場合は、配列内に要素を作成する方がはるかに簡単です。次に、データの解析は1回のパスであり、準拠するように配列を構築します。はい、しばらく時間がかかる場合がありますが、作成される値は待つ価値があります。時間をかけて行うこともできます。1000 ゲームなどの小さなテスト ケースから始めて、プレイされた試合の数を増やします。もう 1 つのアイデアは、現在の時点から開始して、そこからデータベースを構築することです。その期間にヒーローに発生した変更の量に基づいて、これまでにプレイされた最初のゲームに戻る必要はありませんが、データの基礎と信頼性を得るために2〜3か月前に戻ると言ってください.

配列の解析と構築の例:

get match(x)
if length < 15/25, x++; //determine what length matches we want and discredit shorter than 15 for sure.
if players != 10, x++; //skip the match because it didn't finish with 10 players.
if map != normal_mm_map // rule out non mm games, and mid wars
if != mm, rule out custom games
//and so forth

match_psr = match(x).get(average_psr);
match_winner = match(x).get(winner);

//Hero ids of winners
Wh1 = match.(x).get(winner.player1(hero_id)))
Wh2 = match.(x).get(winner.player2(hero_id)))
Wh3 = match.(x).get(winner.player3(hero_id)))
Wh4 = match.(x).get(winner.player4(hero_id)))
Wh5 = match.(x).get(winner.player5(hero_id)))

//hero ids of losers
Lh1 = match.(x).get(loser.player1(hero_id)))
Lh2 = match.(x).get(loser.player2(hero_id)))
Lh3 = match.(x).get(loser.player3(hero_id)))
Lh4 = match.(x).get(loser.player4(hero_id)))
Lh5 = match.(x).get(loser.player5(hero_id)))

//some sort of sorting algorithim to put the Wh1-5 in order of hero id from smallest to largest

//some sort of sorting algorithim to put the Lh1-5 in order of hero id from smallest to largest


if(array([Wh1, Wh2, Wh3, Wh4, Wh5],[Lh1,Lh2,Lh3,Lh4,Lh5],[],[],[],[],[],[],[],[],[]) != null)
array([Wh1, Wh2, Wh3, Wh4, Wh5],[Lh1,Lh2,Lh3,Lh4,Lh5],[],[],[],[],[],[],[],[],[]) +=     array([],[],[1],[][][][](something with psr)[][][[])

else(array.add_element([Wh1, Wh2, Wh3, Wh4, Wh5],[Lh1,Lh2,Lh3,Lh4,Lh5],[1],[][][][](something with psr)[][][[])

何かご意見は?

4

1 に答える 1

1

ゲーム内の各アクターを単純なスキーム 0 ... 84 を使用してエンコードします
。ゲーム内で 85*85 アクターの 2D マトリックスを維持できます。
この配列の各エントリをゼロに初期化します。

ここで、マトリックスの上三角部分のみを使用します。
したがって、任意の 2 人のプレーヤー P1、P2 に対して、配列に一意のエントリがあります。たとえば、array[small(p1,p2)][big(p1,p2)] とします。

array(p1,p2) は、p1 が p2 に対して勝った金額を示します。

イベントループは次のようになります:

For each stat like H=(H1,H2,H3,H4,H5) won against L=(L1,L2,L3,L4,L5) do
    For each tuple in H*L (h,l)  do
         if h<l
           increment array[h][l] by one
         else
           decrement array[l][h] by one

これで、このループの最後に、プレイヤー同士の情報に関する集計情報が得られます。次のステップは、興味深い最適化問題です。
間違ったアプローチ: 2 つのフィールドの行と列が同じではなく、それらの絶対値の合計が最大になるように、このマトリックスで 5 つのフィールドを選択します。この問題に対して優れた最適化アルゴリズムを取得できると思います。ここでは、5 つのタプル (h1,l1)、(h2,l2)、(h3,l3) を計算します ... ここで、h1 が l1 に対して勝つ場合は最大化されますが、l1 が h2 に対して優れていることはまだわかりません。
より簡単で正しいオプションは、(85*84)C5 タプルのセットに対してブルート フォースを使用することです。

于 2012-08-13T15:02:32.263 に答える