2016-11-17 2 views
2

в настоящее время я на самом деле ищу термин специфичный для моей проблемы:лига Планирование без RoundRobin

Я создал лигу> 4 команды Лиги длится 3 раундов (Числа для простоты) матчапов должны быть назначены случайным образом из команд, которые команда еще не сыграла против.

Я изо всех сил стараюсь, чтобы мой текущий код работал с каждым случаем с бахромой, поэтому я хотел бы найти «стандартный» алгоритм, разработанный для таких случаев, но я не могу придумать термин, который я ищу.

Один Расписание Пример будет:

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 команд, может происходить в Round3)

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;  
       } 
      } 
     } 
    } 
} 

Любая помощь за то, что я буду Google будут оценены

ответ

3

Swiss system «не является устраняющий турнир формата, который имеет заранее определенное количество раундов конкурса, но значительно меньше чем в круговом турнире».

Он широко используется в шахматах и ​​других играх. Согласно Википедии:

швейцарские системы обычно используются в шахматы, бридж, киберспорта, Morabaraba, Эрудит, Нарды, сквош, петанк (Кряж), викторина чаша, Magic: The Gathering, политические дискуссии, Warhammer, восьми- мяч, Reversi, Dominion, Pokémon TCG, Yu-Gi-Oh, Blood Bowl, Guild Wars 2, Звездные войны: игра миниатюр X-Wing, путь изгнания и Android: Netrunner.

Он может соответствовать вашим потребностям, и вы можете найти некоторые готовые к использованию реализации.

+0

Так что я в основном ищу швейцарскую систему _without_ оценка вещь. Я постараюсь найти что-то в этом плане, спасибо :) – user1021605

Смежные вопросы