Планирование лиги без 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

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

Это мой текущий код, который создает один раунд. Может случиться, что этот код не даст каждой команде оппонента в 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;
}
}
}
}
}

Любая помощь для того, что я буду Google, будет принята с благодарностью

2

Решение

Швейцарская система «является турнирным форматом, который имеет заданное количество раундов соревнований, но значительно меньше чем в круговом турнире «.

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

Швейцарские системы обычно используются в шахматах, бридж, киберспорте, Морабарабе, Скрэббле, Нардах, Сквоше, Петанке (були), Викторине, Magic: The Gathering, Политические дебаты, Warhammer, восьмой мяч, Реверси, Доминион, Покемон TCG, Yu. -Gi-Oh, Blood Bowl, Guild Wars 2, Star Wars: Миниатюры X-Wing, Путь изгнания и Android: Netrunner.

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]