2

現在、私は実際に私の問題に固有の用語を探しています:

4 チームを超えるリーグを作成しました リーグは 3 ラウンド続きます (数字は簡単にするためです) マッチアップは、チームがまだ対戦していないチームからランダムに割り当てられます。

現在のコードをフリンジ ケースごとに実行するのに苦労しているので、そのようなケース用に開発された「標準」アルゴリズムを調べたいのですが、探している用語が見つかりません。

1 つのスケジュールの例は次のとおりです。

TeamA: C,E,B
TeamB: F,H,A
TeamC: A,D,H
TeamD: G,C,F
TeamE: H,A,G
TeamF: B,G,D
TeamG: D,F,G
TeamH: E,B,C

リーグ/トーナメントで使用される可能性は非常に低いように思われるため、その点については何も見つかりませんでしたが、それが私の要件です.

これは、ONE Round を作成する現在のコードです。このコードでは、ラウンド 3 で各チームに対戦相手が割り当てられない可能性があります (6 チームでテスト済み、ラウンド 3 で発生する可能性があります)。

 public function CalculateDivision()
{
     $teams = Division::find(1)->teams()->get();
     $diffs = array();
     foreach($teams as $team)
     {
//Get possible Opponents
         $opp = Division::find(1)->teams()->where('id','!=',$team->id)->lists('id');
         $matches = $team->matches()->get();
         $plyd = array();
         foreach($matches as $match)
         {   
//Find Opponents a team already has played against
             $plyd[] = $match->teams()->where('id','!=',$team->id)->pluck('id');    

         }
//Substract Opponents already played against from possible Opponents
         $TBP = array_diff($opp,$plyd);
         $diffs[$team->id] = $TBP;
     }
//Order By Least possible Opponents possible
     asort($diffs);
     $this->CalculateMatches($diffs);
}

private function CalculateMatches($teams)
{
//$teams equals $teams[teamID] = [Opponent1ID,Opponent2ID ...]
    $setTeams = array();
    foreach($teams as $key => $team)
    {
//If Team hasn't already a new matchup find opponent from their possible opponent array
        if(!in_array($key,$setTeams))
        {
           shuffle($team);
           foreach($team as $opponent)
           {
//If possible opponent hasn't already a matchup create one, add both teams to 'has already a match' so the loop doesn't evaluate them again
               if(!in_array($opponent,$setTeams))
               {
                   $this->CreateMatch($key,$opponent);
                   $setTeams[] = $key;
                   $setTeams[] = $opponent;
                   break;    
               }
           }
        }
    }
}

私がグーグルするものについての助けをいただければ幸いです

4

1 に答える 1

3

スイスのシステムは、「事前に決められたラウンド数の競技を特徴とする非排除トーナメント形式ですが、ラウンドロビントーナメントよりもかなり少ない」.

チェスやその他のゲームで広く使用されています。ウィキペディアによると:

スイスのシステムは、チェス、ブリッジ、e スポーツ、モラバラバ、スクラブル、バックギャモン、スカッシュ、ペタンク (ブール)、クイズ ボウル、マジック: ザ ギャザリング、ポリシー ディベート、ウォーハンマー、エイトボール、リバーシ、ドミニオン、ポケモン TCG、ユウで一般的に使用されています。 -Gi-Oh、Blood Bowl、Guild Wars 2、Star Wars: X-Wing Miniatures Game、Path of Exile、Android: Netrunner。

それはあなたのニーズに合うかもしれませんし、すぐに使える実装を見つけることができます。

于 2016-11-17T08:22:31.740 に答える