问题
I'm trying to create a scheduler for a sports league and I'd like to schedule the teams in groups so every team gets one game per group. I think the thing I'm trying to do is an existing problem in computer science, but I don't know what it's called and I'm having trouble finding information about it. Either way, here's the situation:
Let's say I have a set of teams A = {1,2,3,...,n}
and a set of pairs of those teams B = {(1,2), (1,3), (2,4), (6,9),...}
. B does not have every possible combination of teams from A. Assume that A has an even number of teams. My program is trying to create a subset of B (lets call that subset S) such that every team from A appears in S exactly once. It does this by moving the pairs from B to S, one at a time. Let's say that it has already placed several pairs into S. How can I find out whether it is possible to successfully create S given the current situation?
Example:
A = {1,2,3,4}, B = {(1,2), (1,3), (1,4), (3,4)}
If after one move, S = {(1,2)}, then it can be completed by moving (3,4).
If after one move, S = {(1,3)}, then it cannot be completed.
Update: This algorithm will be one of the heuristics I use in my schedule generator. The goal is to implicitly split the schedule into "waves" where each team has one game per wave. So let's say that I have a pool of 16 teams and each team will have 5 games against other teams in the pool. An ideal schedule would make sure that no team has their second game before every team has had at least one game. The scheduler picks games one at a time and assigns them a date. So the idea is to have the scheduler keep track of the games scheduled in this "wave" and to never pick a game that would prevent each team from playing exactly once in the current wave. The scheduler also uses a bunch of other heuristics, so I can't explicitly order the games and have it go in order.
I'm sorry if this is unclear or not very rigorous. Feel free to ask for clarification and I'll do my best to explain further.
回答1:
It's Maximum matching problem in graph theory. There are some known algorithms to solve it.
In your problem graph G (V - set of vertexes, E - set of edges) where V = A, E = B. Also add opposite edges to graph. Weight of each edge is 1.
I suggest you to use Hungarian Algorithm for bipartite graphs and Edmond's algorithm for others.
回答2:
It is important to make some assumptions to clarify what is presented below.
First, assume we are talking about 16 teams in a table tennis league, and you want a schedule where all teams play five games without duplicating any opponents.
Second, you want all 16 teams to complete playing in each set before any team plays again.
Third, you want all teams to be distributed to play on the 8 tables and not have one team always scheduled to play at the same table.
If I got the assumptions correct, what you need is the first 5 "sets" (you call each set a wave) of games from a balanced 16 team round robin schedule. This would give you a tournament type of team match-ups where each team plays 5 games against 5 different teams. Each set (or wave) has 8 games and no team is always scheduled to play on the same table, and teams do not play games in their next set until all teams have finished playing the current set.
Below are the first 5 "sets" from a balanced 16 team schedule I created for you. Check it out.
16 TEAM SCHEDULE DATE 8/3/14
DATE DAY TIME LOCATION GM# HOME VS VISITOR
___ __ ___ _______ Table #1 1 #1 v #16
___ __ ___ _______ Table #2 1 #2 v #15
___ __ ___ _______ Table #3 1 #3 v #14
___ __ ___ _______ Table #4 1 #4 v #13
___ __ ___ _______ Table #5 1 #5 v #12
___ __ ___ _______ Table #6 1 #6 v #11
___ __ ___ _______ Table #7 1 #7 v #10
___ __ ___ _______ Table #8 1 #8 v #9
___ __ ___ _______ Table #1 2 #13 v #2
___ __ ___ _______ Table #2 2 #15 v #1
___ __ ___ _______ Table #3 2 #16 v #14
___ __ ___ _______ Table #4 2 #12 v #3
___ __ ___ _______ Table #5 2 #11 v #4
___ __ ___ _______ Table #6 2 #10 v #5
___ __ ___ _______ Table #7 2 #9 v #6
___ __ ___ _______ Table #8 2 #7 v #8
___ __ ___ _______ Table #1 3 #6 v #7
___ __ ___ _______ Table #2 3 #16 v #12
___ __ ___ _______ Table #3 3 #15 v #13
___ __ ___ _______ Table #4 3 #14 v #1
___ __ ___ _______ Table #5 3 #2 v #11
___ __ ___ _______ Table #6 3 #4 v #9
___ __ ___ _______ Table #7 3 #5 v #8
___ __ ___ _______ Table #8 3 #3 v #10
___ __ ___ _______ Table #1 4 #8 v #3
___ __ ___ _______ Table #2 4 #14 v #12
___ __ ___ _______ Table #3 4 #1 v #13
___ __ ___ _______ Table #4 4 #9 v #2
___ __ ___ _______ Table #5 4 #10 v #16
___ __ ___ _______ Table #6 4 #11 v #15
___ __ ___ _______ Table #7 4 #4 v #7
___ __ ___ _______ Table #8 4 #5 v #6
___ __ ___ _______ Table #1 5 #3 v #6
___ __ ___ _______ Table #2 5 #13 v #11
___ __ ___ _______ Table #3 5 #15 v #9
___ __ ___ _______ Table #4 5 #2 v #7
___ __ ___ _______ Table #5 5 #10 v #14
___ __ ___ _______ Table #6 5 #16 v #8
___ __ ___ _______ Table #7 5 #12 v #1
___ __ ___ _______ Table #8 5 #4 v #5
-
来源:https://stackoverflow.com/questions/7879895/algorithm-selecting-pairs-of-teams-from-a-set-of-games