A Social Swiss

A friend asks for help with pairings for a tennis league he runs.

There are eleven people in the league, and the league has two tennis courts reserved once each week for 24 weeks. Each week, the league will play a doubles match on each court, eight people playing in four partnerships, with three people getting a bye each week.

Here are the parameters he’d like to observe:

The schedule needs to be determined in advance, so that everyone knows which weeks they’ll be playing, and with which partner. It’s not necessary for them to know who there opponents are;

Each player should play nearly the same number of times over the 24 weeks;

Everyone should play with everyone else at least once, but no more than twice;

No one should draw a bye two weeks in a row; and

The pairings should, as far as possible, encourage “interesting” matches, with the better players tending to play other good players, and the weaker players drawing other weak players.

I’ve got a format for that. I’ll call it the “Social Swiss”. In this post, I’ll show how the first four criteria can be met, leaving the fifth criterion for a later post.

First, let’s generate the partnerships. This is essentially the same problem as making pairings for a round robin, except that we’ll be forming partnerships rather than full matches.

A quick way to make round robin pairings is illustrated here:

You start with numbers representing the players arranged in a “U” pattern, as in the upper left cell. Then, leaving the number 1 in place, you rotate the other numbers clockwise, and repeat the procedure until you get to the point where one more rotation would recreate the initial pairings. When, as here, there are an odd number of players, you add one so things will come out even. Player 1 becomes a phantom player – whoever draws 1 gets a bye.

In this case, however, we need three byes, not just one. This is easily accomplished by designating the fourth line in each cell for byes. Thus, in week one, the partnerships are [2&11, 3&10, 5&8, 6&7], with 12, 4, and 9 getting byes. It would be a mistake to choose the second line as the line that gets byes because that would give players byes in successive weeks.

The length of a cycle is 11 matches, but the season for our league is 24 weeks. Here’s how to extend it. First, lets move it from 11 matches to 22 matches. That’s done simply by repeating the rotation. But for the second rotation, we’ll need to designate a different line for byes – let’s make it the third. If we use the same fourth line, that would mean that certain pairings would never happen – 4&9 would be “byed out” in both halves of the season.

Finally, let’s add the last two weeks pairings. It’s tempting just to begin another cycle, this time choosing another bye line. But that would mean that certain partnerships – the ones that don’t happen on any bye line – would happen three times, and that can be avoided. So instead we’ll just choose two week’s worth of pairings from among the pairings that were byed out before in one cycle or the other.

Now we’ve got pairings that meet our criteria. Each player gets 18 matches and six byes, except for those who draw byes in the last two weeks, who get 17 matches and seven byes. No one’s byes are consecutive. And all possible partnerships happen (and most them happen twice).

So far, we’ve drawn partnerships, but not matches. How to designate the matches, and how to make more of those matches interesting, will be discussed in the next post.