Генератор расписаний случайных команд PHP - Круглый Робин Планировщик - PullRequest
2 голосов
/ 03 мая 2011

После получения отрицательного отзыва, задавая этот вопрос в новом вопросе ... вот мой пересмотренный вопрос.Да, это тот же проект, над которым я работаю, но мне было непонятно, нужно ли мне в основном иметь планировщик типа Round Robin.

Я работаю над планировщиком хоккейной лиги Round Robin Style, и мне нужно немногоhelp.

Общая цель заключается в том, чтобы конечный пользователь-администратор мог указать 3 переменные и заставить его выполнять круглое расписание в стиле Робина до тех пор, пока не будет достигнут счетчик WEEKS.Ниже приведен пример количества команд и количества недель, в которые проводятся игры.

$Teams = array('team1','team2','team3','team4','team5','team6','team7','team8');
$Weeks = 16;

Цель состоит в том, чтобы сделать это 16 раз, делая 4 игры в неделю, при этом каждая команда играет по 1 разу.неделю.Алгоритм циклического перебора должен иметь команды, играющие разные команды каждую неделю, пока не будут составлены все возможные комбинации, но не более 16 недель.В случае, если у нас всего 4 команды или меньше команд, чем возможных комбинаций, нам нужно было бы начать круговой прием заново, пока не будет достигнут номер недели.


РЕДАКТИРОВАТЬ:

Я на 90% понимаю, что мне нужно для этого сценария ... но я застрял на одном.Мне нужна помощь в слиянии многомерного массива.

Во-первых, ярусы.Далее идут недели (все недели 1).Затем игры для команды совпадают.

Array
(
[1] => Array
    (
        [1] => Array
            (
                [1] => Array
                    (
                        [home] => Whalers
                        [visitor] => Lumberjacks
                    )

                [2] => Array
                    (
                        [home] => Team America
                        [visitor] => Wolfpack
                    )

            )

    )

[2] => Array
    (
        [1] => Array
            (
                [1] => Array
                    (
                        [home] => Warriors
                        [visitor] => Litchfield Builders
                    )

                [2] => Array
                    (
                        [home] => Icemen
                        [visitor] => Nighthawks
                    )

            )

    )

[3] => Array
    (
        [1] => Array
            (
                [1] => Array
                    (
                        [home] => The Freeze
                        [visitor] => Devils Rejects
                    )

                [2] => Array
                    (
                        [home] => Cobras
                        [visitor] => New Haven Raiders
                    )

                [3] => Array
                    (
                        [home] => Crusaders
                        [visitor] => Whalers
                    )

                [4] => Array
                    (
                        [home] => Blizzard
                        [visitor] => CT Redlines
                    )

            )

    )

)

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

Array
    (
        [1] => Array
            (
                [1] => Array
                    (
                        [home] => Whalers
                        [visitor] => Lumberjacks
                    )

                [2] => Array
                    (
                        [home] => Team America
                        [visitor] => Wolfpack
                    )

                [3] => Array
                    (
                        [home] => Warriors
                        [visitor] => Litchfield Builders
                    )

                [4] => Array
                    (
                        [home] => Icemen
                        [visitor] => Nighthawks
                    )

                [5] => Array
                    (
                        [home] => The Freeze
                        [visitor] => Devils Rejects
                    )

                [6] => Array
                    (
                        [home] => Cobras
                        [visitor] => New Haven Raiders
                    )

                [6] => Array
                    (
                        [home] => Crusaders
                        [visitor] => Whalers
                    )

                [8] => Array
                    (
                        [home] => Blizzard
                        [visitor] => CT Redlines
                    )

            )

    )

Ответы [ 4 ]

1 голос
/ 17 декабря 2013

Вопрос ниже скопирован сверху.

Поправьте меня, если я ошибаюсь, но если все команды должны играть на одной и той же регулярной основе, возможно ли, чтобы все команды играли в одинаковое количество матчей?, если есть нечетное количество команд?- Йоши 3 мая 11 года в 15:05


Мишель,

Количество команд, которые вы пытаетесь объединить в пару (в данном случае 8 команд за 16 недель) может бытьсложная задача, и это только начало «процесса планирования».Как только правильные, сбалансированные пары команд определены, это только начало составления расписания для распределения.Далее, список из 4 еженедельных временных интервалов включает в себя;день недели, время начала и название места для каждого временного интервала в течение всего 16-недельного сезона.Комментарий: Что было бы наиболее полезным для вас, так это получить матрицу планирования 8 команд, которая имеет сбалансированного противника и дома и в гостях .Это имеет большое значение в качестве графика.Важно равномерно распределять ранние и поздние временные интервалы, равный статус дома и в гостях и равное распределение команды с оппонентами.Большая часть баланса достигается за счет использования матрицы сбалансированных командных пар.

После 35 лет преподавания, инструктажа и планирования спорта в районе Бостона я могу предложить следующую информацию.Создание расписаний лиг или игр для спортивных организаций, кажется, является бесконечной задачей, разделяемой многими, и повторяется снова и снова, так как возраст участников увеличивается, а те, кто управляют лигами, меняются, кривая обучения, связанная с созданием расписаний, важна для тех, ктоВзять на себя.

С учетом сказанного, я поражен тем, как много высокообразованных математических волшебников пытаются найти идеальное решение (алгоритм), которое решит проблему планирования.Я и мой друг (который является гением математики / программиста) в течение 3 лет создали программное обеспечение, которое идеально уравновешивает все важные компоненты при создании расписаний для 4-22 команд.Мы узнали, что не существует алгоритма, который мог бы обрабатывать все возможные переменные, которые добавляются к нормальным переменным для создания сбалансированных расписаний.Я говорю о том, что существует столько же «что, если», так и математических перестановок и комбинаций, которые имеют дело только с созданием матрицы команд, в которой перечислены противники и статус игры для домашних и гостей.

Например: давайте создадимидеально сбалансированное расписание для 9 командных дивизионов, играющих 4 игры в неделю.Через девять недель все команды сыграли в 8 игр, у всех было 1 свидание, все сыграли два раза в каждом из 4 временных интервалов, и все они были назначены в качестве домашней команды 4 раза и гостевой команды 4 раза.

Что еще кто-нибудь может хотеть?Ну, теперь приходит веселье.Поскольку в 4 выбранных вами временных интервалах есть 2 игры каждую субботу и 2 игры каждое воскресенье, появляется первая проблема (после того, как расписание создано, опубликовано и передано, когда 2 тренера из 2 разных команд звонят и говорят, что работают по субботам,Можете ли вы перенести наши игры в воскресенье? Конечно, я могу это сделать. Я просто внесу изменения, повторно опубликую и повторно распространю расписания.

После того, как новые расписания будут распространены, спустя несколько дней,другой тренер звонит и говорит: «Эй, вы перенесли некоторые из моих игр в субботу, я работаю по субботам ..., переведите их обратно». Телефон снова звонит. На этот раз это тренер из другой команды и говорит, что они втурнир на 5-й неделе графика и не может играть на этой неделе. Наконец, последний звонок поступает от еще одного тренера. Он говорит, что родители одного из его игроков преподают классы CCD по воскресеньям, а половина его команды находится вКласс CCD и хочет перенести все наши воскресные игры в субботу. Хватит!

Моя точка зрения не имеет значения, что вы делаете или каков идеальный график, лучшее решение - выяснить как можно больше ограничений или ограничений команды игрока / тренера, прежде чем назначать игровые дни и временные интервалы для любого расписания.Эти непредсказуемые переменные создают беспорядок в идеальном графике.Люди сердятся и жалуются, когда распределяются нежелательные графики.Когда расписание достаточно плохое, некоторые родители не подпишут своего ребёнка на следующий год.Это происходит, когда у вас молодая семья с двумя или тремя маленькими детьми, и работа отца ограничивает его возможности быть там.Когда есть игра ранним утром, я думаю, вы можете увидеть трудности для мамы, когда все это ложится ей на плечи.

Для тех, кто плохо знаком с планированием, оставайтесь с ним.Со временем это улучшится после того, как вы приобретете небольшой опыт решения проблем.Если вы приобрели программу для планирования командных пар, будьте осторожны.Настаивайте на том, чтобы увидеть полный круговой график графика, который они создают.Проверьте вещи, описанные выше (о балансе и распределении).

Bob R

1 голос
/ 03 мая 2011

Снимите одно, перемешайте, скажите другое.Там твоя игра.Если кто-то остался, какая-то случайная команда должна стать рабочей лошадкой и сыграть в две игры на этой неделе:

for ($week=1; $i<=$totalWeeksPlayed; $i++)
{

  $games = 0;
  $temp = $teams;

  while (count($temp) > 1)
  {
    $team = array_shift($temp);  
    shuffle($temp);
    $opponent = array_shift($temp);
    $game[$week][$games] = $team . ' vs' . $opponent;
    $games++;
  }

  if (count($temp) == 1)
  {
    $workhorses = $teams;
    unset($workhorses[array_search($temp[0], $teams));
    shuffle($workhorses);
    $team = $temp[0];
    $opponent = array_shift($workhorses);
    $game[$week][$games] = $team . ' vs' . $opponent;
    $games++;
  }

}
1 голос
/ 03 мая 2011

Может быть, что-то вроде этого?

<?php
$teams = array(
    'Team 1',
    'Team 2',
    'Team 3',
    'Team 4',
    'Team 5',
    'Team 6',
    'Team 7',
    'Team 8'
);

function getMatches($teams) {
    shuffle($teams);
    return call_user_func_array('array_combine', array_chunk($teams, sizeof($teams) / 2));
}

for ($i = 0; $i < 14; $i += 1) {
    print_r(getMatches($teams));
}

Я не совсем понял, как вы определяете расписание, поэтому, если вы сможете немного это объяснить, я постараюсь помочь.

0 голосов
/ 03 мая 2011

Учитывая таблицу команд, скажем команда ( название команды );

и таблица светильников

крепеж ( Дата; );

С отношениями, разложенными «игрой»

играет ( fixture_date. название команды );

Тогда это просто вопрос повторения каждой даты, затем команды и случайного выбора команды, у которой еще нет расписания на эту дату, и кто не играл в выбранной команде (или не играл в выбранной команде). в последнее время).

Хотя более простым решением было бы иметь команду [n] (где n равно 0 .... количество команд -1) играть в команду [(n + (количество команд))% X] для различных значений X.

...