Помогите создать генератор расписания - PullRequest
0 голосов
/ 03 августа 2009

Я работаю над упражнением в программировании, которое заинтересовало меня некоторое время. Цель этого упражнения состоит в том, чтобы программно составить график софтбола для сезонов. То, что я ищу, это общий совет, а не конкретный ответ, поскольку я пытаюсь что-то узнать в процессе.

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

Проблема: Имея список команд, составьте расписание, в котором каждая команда сыграет 2 игры, и ни одна команда не сможет сыграть в одной команде дважды за одну ночь.

Ответы [ 4 ]

2 голосов
/ 17 декабря 2009

Я пошел с реализацией, которую я нашел в Википедии для Round Robin http://en.wikipedia.org/wiki/Round-robin_tournament

Стандартный алгоритм для круговых игр состоит в том, чтобы назначить каждому участнику номер и спарить его в первом раунде…

  1  2  3  4  5  6  7  
  14 13 12 11 10 9  8

… затем закрепите одного конкурента (номер один в этом примере) и поверните остальных по часовой стрелке…

 1  14 2  3  4  5  6
 13 12 11 10 9  8  7


 1  13 14 2  3  4  5
 12 11 10 9  8  7  6

… пока вы не окажетесь почти в исходном положении

 1  3  4  5  6  7  8
 2 14  13 12 11 10 9
1 голос
/ 03 августа 2009

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

например. учитывая команды 1..10, сделайте это:

Team A: 1  2  3  4  5  6  7  8  9 10
Team B: 2  3  4  5  6  7  8  9 10  1

поэтому в первой игре команда A играет команду B. Для второй игры снова поверните:

Team A: 1  2  3  4  5  6  7  8  9 10
Team B: 3  4  5  6  7  8  9 10  1  2

Девять игр дадут вам полный круговой прием, и вы сможете начать сначала. Возьмите игры в пары для ваших ночных матчей.

EDIT

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

0 голосов
/ 08 августа 2009

Следующее решение может быть не лучшим, но посмотрите, работает ли оно для вас.

Я начинаю с создания структуры для каждой игры

public struct Game {
   private int TeamA;
   private int TeamB;
   private bool GamePlayed;

   // I am adding this to quickly see what team is playing. I used this for debugging
   // purposes to make sure the same team doesn't play another team twice.
   public override ToString() {
      return TeamA.ToString() + " vs. " + TeamB.ToString(); 
   }
}

Затем я создаю Список, в который входят все различные комбинации 10 команд, играющих друг с другом. Там должно быть 45.

List<Game> AllGamesInSchedule = new List<Game>();

for (int i = 1; i <= 10; i++) {
    for (int j = (i + 1); j <= 10; j++) {
        AllGamesInSchedule.Add(new Game(i, j));
    }
}

// This prints all the different game combinations out to the console to see
// that they are all different.
foreach (Game game in AllGamesInSchedule) {
    Console.WriteLine(game.ToString());
}

Теперь вы можете создать метод, который выбирает игры из этого списка. Как только игра выбрана, измените поле GamePlayed на true, чтобы знать, что вы не должны выбирать этот матч снова. Или вы можете просто удалить игру из списка.

Вы сказали, что хотели руководства, и поэтому я не создал метод выбора игр.

Надеется, что это поможет.

0 голосов
/ 08 августа 2009

Используйте этот вид тиража. Вы держите команды в кольце и вращаете кольцо вокруг.

Team A:  1 2 3
Team B:  4 5 6

Team A:  4 1 2
Team B:  5 6 3

Team A:  5 4 1 
Team B:  6 3 2

Team A:  6 5 4
Team B:  3 2 1

Team A:  3 6 5
Team B:  2 1 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...