Мне нужно генерировать последовательности игр, используя алгоритм round robin. У меня есть страница php, где пользователь может ввести имя турнира, которое будет вставлено в базу данных, и у него есть раскрывающееся меню до 32 команд (выберите количество команд).
Так что, если я выберу 4 команды на этой странице, так это будет от команды 1 до команды 4, которая будет 6 матчей, потому что каждая команда будет играть другую команду один раз. Я знаю, как работает алгоритм, но я не совсем уверен, как написать запрос для этого.
Я создал команду таблицы:
Team_id 01 02 03 etc Team_name Team1 Team2 Team3 etc.
Что мне делать дальше?
Я создал функцию roundrobin с нуля, поскольку я думал, что было бы легче получить те же результаты, а также позволить мне использовать массивы, заполненные строками, вместо цифр.
Поскольку я вытаскиваю список имен из базы данных и добавляю в массив, я могу теперь планировать это непосредственно с помощью функции ниже. Никакого дополнительного шага, необходимого для привязки чисел к именам и т. Д.
Пожалуйста, не стесняйтесь попробовать, и если это сработает, оставьте комментарий. У меня также есть версия, которая позволяет расписание 2-го (домашнего и возвратного) и / или перетасовку. Если кто-то заинтересован в том, чтобы тот тоже оставил свой коммент.
<?php /** * @author DDM van Zelst * @copyright 2012 */ function scheduler($teams){ if (count($teams)%2 != 0){ array_push($teams,"bye"); } $away = array_splice($teams,(count($teams)/2)); $home = $teams; for ($i=0; $i < count($home)+count($away)-1; $i++){ for ($j=0; $j<count($home); $j++){ $round[$i][$j]["Home"]=$home[$j]; $round[$i][$j]["Away"]=$away[$j]; } if(count($home)+count($away)-1 > 2){ array_unshift($away,array_shift(array_splice($home,1,1))); array_push($home,array_pop($away)); } } return $round; } ?>
Как использовать, например, создать массив вроде:
<?php $members = array(1,2,3,4); ?>
или
<?php $members = array("name1","name2","name3","name4"); ?>
затем вызовите функцию, чтобы создать расписание, основанное на следующем массиве:
<?php $schedule = scheduler($members); ?>
Чтобы отобразить приведенное расписание массива, просто сделайте так, как показано ниже или в любом случае: этот маленький код отображает расписание в хорошем формате, но использовать его в любом случае вам нравится.
<?php foreach($schedule AS $round => $games){ echo "Round: ".($round+1)."<BR>"; foreach($games AS $play){ echo $play["Home"]." - ".$play["Away"]."<BR>"; } echo "<BR>"; } ?>
Оставьте заметку, если она сработает для вас или если вы заинтересованы в двухсторонней версии с тасованием.
Существует довольно простой алгоритм для создания круговых матчей, мое решение будет следующим: (в псевдокоде):
И это все, что будет производить все необходимые вам игры.
Например, с 4 командами:
Первая половина массива находится сверху, вторая половина находится внизу, совпадения – числа выше / ниже друг друга. Индексы массивов (чтобы проиллюстрировать, что я имею в виду именно):
[0] [1] [2] [3]
Раунд 1:
1 2 3 4
Раунд 2:
1 4 2 3
Раунд 3:
1 3 4 2