prosit
asked on
Round Robin Programming
Hi,
I know I can't be the only game scheduler in the world with this problem...
I need to write a tool that schedules games for x number of weeks with x number of teams that ensures every team plays each other (if possible).
The basics of the functionality is this:
* There can be an even or odd number of teams, if odd there will of course be a "bye" week where one team is not playing (buy could be considered a team when doing the algorithm).
* The number of weeks can be either even or odd, basically the algorithm should just run until the number of weeks run out even if all teams don't get to play each other.
* The rotation should be so that every team plays every team but never itself (if number of weeks permits)
Basically for 4 teams the result would look like this:
WEEK1:
A vs B
C vs D
WEEK2:
A vs C
B vs D
WEEK3:
A vs D
B vs C
I would like the code to be able to handle the number of games as input, but honestly if the rotation is solved, I can limit the number of games myself.
I do appreciate any help or direction I can get.
Thanks
~j
I know I can't be the only game scheduler in the world with this problem...
I need to write a tool that schedules games for x number of weeks with x number of teams that ensures every team plays each other (if possible).
The basics of the functionality is this:
* There can be an even or odd number of teams, if odd there will of course be a "bye" week where one team is not playing (buy could be considered a team when doing the algorithm).
* The number of weeks can be either even or odd, basically the algorithm should just run until the number of weeks run out even if all teams don't get to play each other.
* The rotation should be so that every team plays every team but never itself (if number of weeks permits)
Basically for 4 teams the result would look like this:
WEEK1:
A vs B
C vs D
WEEK2:
A vs C
B vs D
WEEK3:
A vs D
B vs C
I would like the code to be able to handle the number of games as input, but honestly if the rotation is solved, I can limit the number of games myself.
I do appreciate any help or direction I can get.
Thanks
~j
Hi,
You are definitely not the only person with this issue.
Check out: http://en.wikipedia.org/wiki/Round-robin_tournament
and read the "Scheduling algorithm" section.
That should give you an idea of how to implement this in code.
Hope this helps,
Darren
You are definitely not the only person with this issue.
Check out: http://en.wikipedia.org/wiki/Round-robin_tournament
and read the "Scheduling algorithm" section.
That should give you an idea of how to implement this in code.
Hope this helps,
Darren
ASKER
Although this works, it's not really a VB solution...
I'd still prefer if that was a possibility...
~j
I'd still prefer if that was a possibility...
~j
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
The way I would approach this would be to iterate all the unique two player combinations. The simplest approach was to create a Players table and the join the table with itself in a query like this:
When the Players table contains (ABCD), the result is:
When the Players table contains (ABCDE?), the result is:
The code to process this builds the weeks from the query results. If a player has appeared on the left or right side of a match in a week, they can not be assigned to another match in that same week.
In the following example, the first PvP pair is simply added to the first week. Since the second pair contains player A, we have to find a week that doesn't already contain player A -- week 2. The third pair contains player B, so we can't add it to the first week and contains player C, so we can't add it to the second week -- week 3. The fourth pair contains player A, so we can't add it to either of the first two weeks -- week 3. The fifth pair contains player B, so we can't add it to week 1 -- week 2. The sixth pair goes into week 1.
Week1: A B; C D
Week2: A C; B D
Week3: B C; A D
SELECT Players.Player, Players_1.Player
FROM Players, Players AS Players_1
WHERE (((Players.Player)<[Players_1].[player]));
When the Players table contains (ABCD), the result is:
Players.Player
Players_1.Player
A B
A C
B C
A D
B D
C D
When the Players table contains (ABCDE?), the result is:
Players.Player
Players_1.Player
? A
A B
? B
A C
B C
? C
A D
B D
C D
? D
A E
B E
C E
D E
? E
The code to process this builds the weeks from the query results. If a player has appeared on the left or right side of a match in a week, they can not be assigned to another match in that same week.
In the following example, the first PvP pair is simply added to the first week. Since the second pair contains player A, we have to find a week that doesn't already contain player A -- week 2. The third pair contains player B, so we can't add it to the first week and contains player C, so we can't add it to the second week -- week 3. The fourth pair contains player A, so we can't add it to either of the first two weeks -- week 3. The fifth pair contains player B, so we can't add it to week 1 -- week 2. The sixth pair goes into week 1.
Week1: A B; C D
Week2: A C; B D
Week3: B C; A D
ASKER
Exactly what I asked for... thanks
~j
~j
Open in new window