web-dev-qa-db-ja.com

トーナメントブラケットアルゴリズム

シングルエリミネーションブラケットとダブルエリミネーションブラケットを作成するアルゴリズムを探しています。

最初のステップは、SOのいくつかの場所で見つかったシードアルゴリズムを含む、さようならを理解することでした: here (さようなら、最後のn個の過剰なチームを置き換えてシード位置をシフトするだけでbを導入できるn回)そして here (さようならが焼き込まれ、私は位置を変えるだけでよい)。

これは、私がこのようなペアのチームを使用していたアルゴリズムの改善です:[(x, -x - 1) for x in range(num_players / 2)]そして、期待どおり次のラウンドを定義する代わりに:Winner Match_i vs Winner Match_i+1 それはそのようになります Winner Match_i vs Winner Match_n-i、非常に直感的でなく、維持が困難です。

しかし、今私はブラケットを作るためのアルゴリズムを定義しようとしています。シングルエリミネーションブラケットとダブルエリミネーションブラケットを生成する実際のアルゴリズムを見つけるのに苦労しています。

単一の除去ブラケットの生成についてはあまり心配していません。これは、さようならでさえも簡単で、さまざまな慰めモードをサポートしていることも考慮しているためです。

しかし、二重消去ブラケットは私を失望させています。どこを見ても、それらは異なる方法で構築されています。そして、それらの1つを選択できないだけでなく、特にバイが関与している場合に、ブラケット構造が壊れて問題の解決が難しくなるため、一致間の関連付けを行う方法を理解できません。

私は自分のコードを投稿しますが、それはかなり長く、厄介で、ブラケットが正しく生成されないといういくつかのバグがあります。そのため、reliableブラケット生成アルゴリズム。

3
dabadaba

コードを提供するリソースを指す はどちらもトピックから外れているため、この問題の独自のソリューションを簡単に作成する方法を説明します。

プログラミングの問題に対する公開されたソリューションをめちゃくちゃに注ぐのではなく、ドメインの専門家に相談してください。

シングルまたはダブルのエリミネーショントーナメントを実行するには、「ブラインドドロー」または「シード」の2つの方法があります。

シードトーナメントは通常、リーグまたはシーズンのイベントで実行されるため、スキルレベルを決定できます。

1位にランク付けされたチームプレーヤーは最低ランクのシードを、2位にランクされたチームは2番目にランクの低いシードを再生します。

シングルまたはダブルのエリミネーショントーナメントが必要かどうかを判断するには、チーム数を見積もる必要があります。これが決定したら、シングルまたはダブルのエリミネーショントーナメントのルールに従います。

erasabletournamentbrackets.com-シードトーナメント

つまり、種をまくには、ブラケットトーナメントが始まる前にチームをランク順に並べる必要があります。それらをランダムに配置したままにしておくと、盲目になります。シードを実行するときに並べ替え手順を追加するだけでよいようです。その後、シードされたものとブラインドの両方に同じコードを使用できるはずです。

Double Elimination Tournament Chart - Blind Draw - 16 Player FieldDouble Elimination Tournament Chart - Seeded - 16 Player Field

これら2つを注意深く比較すると、実際には非常によく似ていることがわかります。違いは順序です。 1プレイ16はマッチを構築するための良い方法です。なぜなら、あなたがしなければならないのは、それらを順番にランク付けしてから、最高のものを最悪のものと一致させることです。この最高から最悪のパターンは、ラウンドからラウンドへと繰り返されます。これにより、勝者が常に最高ランクである場合、1は可能な限り2に直面しません。これを2のべき乗で一般化できるはずです。

最終トーナメントの勝者をトーナメント前のランクに従ってソートし、それをもう一度行うことで、すべてを管理できます。また、敗者のためにこれを行うと、ダブルエリミネーションの敗者側の次のラウンドがあります。

勝者の勝者に敗者の勝者を向かわせることで、すべてを完了します。

それで、すべてをうまく機能させることができるとしましょう。 byes はどうですか?

さようなら1 |bī| 名詞1割り当てられた対戦相手がいない場合、競技者を次のラウンドの競技に直接転送します。

[New Oxford American Dictionaryから。]

さようならを使ってトーナメントをシミュレートするには、私のお気に入りのパターンに手を伸ばします。 nullオブジェクトパターン を使用すると、割り当てられた対戦相手の不在を表すnull競合相手を作成するだけで、前のコードをすべてそのままにすることができます。どうやって?彼らは常に緩んでいます。このようにして、2の累乗で始めないブラケットを使用できます。たとえば12のようにします。

Double Elimination Tournament Chart - Seeded - 12 Player Field

それを注意深く見ると、16プレーヤーのシードフィールドとの共通点に気付くでしょう。いくつかのスポットが消去されている以外はすべて同じです。それらの消去されたスポットは、常にルーズであるヌルオブジェクトプレーヤーを置く場所です。

その印刷を機能させるには、nullオブジェクトプレーヤーが含まれているブラケットの印刷を抑制します。

つまり、常に緩んでいてブラケットを印刷しないプレーヤーを紹介するだけで、コードを変更することなく、最初のラウンドまたはすべてのラウンドでバイを自由に行うことができます。

これらのバイを使用すると、これを任意の数の競合他社に対して一般化することが可能になるはずです。

3
candied_orange