• Welcome to the Heroscapers 2.0 site! We've still got some dust to clear and adjustments to make, including launching a new front page, but we hope you enjoy the improvements to the site. Please post your feedback and any issues you encounter in this thread.

OHS event pairing rules

dok

GenCon Main Event Champion - 2010, 2011, & 2017
Site Supporter
First Round

  • Sort the players randomly.*
  • Repeatedly pair the highest-up unpaired players (e.g. pair 1 against 2, then 3 against 4, etc).
  • Avoid any rematch from the previous two seasons.
    • If 5 has played 6, try 5 vs. 7, then 5 vs. 8, etc.
    • If you reach the bottom of the list without finding an opponent that avoids a rematch, then un-pair the last paired players, and try the player against them (e.g. if 5 has played all players below 5, then un-pair 3 and 4 and try 5v3, then 5v4).

* note on random numbers:
Spoiler Alert!


0-loss and 1-loss tiers after the first round

Sort the players by their Strength of Schedule.*

While there are unpaired players in the tier:

Select the unpaired player with the highest Strength of Schedule. This is player A. To find a match for that player:

  1. Find the the remaining unpaired player with the lowest ranking who has not already played that player in this event (or, for the second round, in the previous event). This is player B.

  2. If player B has a strength of schedule in the top half of the remaining unpaired players, order the bottom half (by Strength of Schedule) of the remaining unpaired players by ranking, from worst ranking to best ranking. Find the player whose ranking position in the bottom half matches player B's strength of schedule position. Call this player C. If player C's ranking is lower than player A's ranking, then player B is not matched with player A, and you return to step 1 to find a new match for player A (now ignoring player B).
    Example: There are four players in the tier: dok, Xorlof, awesomeunleashed, and Kinseth, and their strengths of schedule are in that order. Their order by ranking is dok, Kinseth, awesomeunleashed, Xorlof.

    dok is selected as player A. Xorlof is selected as player B, as he has the lowest ranking of the other three. However, Xorlof is in the top half of the tier by SoS (#2) and has the option to refuse the matchup. So we order the bottom two players by reversed ranking, and find the #2 player. That is Kinseth, who is then player C.

    Since Kinseth is ranked below dok, Xorlof is NOT matched up with dok. The selection process to find dok's opponent is repeated with Xorlof ignored, and dok is matched up with awesomeunleashed (the next-lowest ranked player). The process then repeats again; Xorlof becomes player A and matched with Kinseth.
  3. If rematch avoidance prevents any unpaired players remaining in the tier from being matched up with that player, then repeat the process to find a match for player A again, but ignore step 2. If there are still no options, then un-pair the last matchup you set, and try to pair player A again, with those two players now available.

* Strength of Schedule formulation:
Spoiler Alert!


Pair-up
  • When a player needs to be paired up from this tier, one is chosen at random from the bottom-half SoS players in the tier (median SoS is eligible). A player cannot be paired up twice in the same event.

2 and 3 loss tiers

  • Sort the players by ranking.
  • Pair adjacent players (1 plays 2, 3 plays 4, etc)
  • Avoid any rematch from the previous two seasons. (Technique is the same as the first round of the event.)
  • If there is a need for a bye player in the round, that player is randomly determined before any matchups or pair-ups are done. The same player should not receive a bye twice in the event.
Pair-up
  • When a Pair-up is needed, the highest-ranked 2 loss player is added to the next highest tier before any matchups are done.
  • That player is considered part of that tier (their strength of schedule is automatically considered lower half in the case of feeding into the 1-1 or 2-1 tiers).

Playoffs
  • Sort the players by their record (most wins, then fewest losses), then by Strength of Schedule.
  • Use these rankings to determine byes/play-ins.
  • Re-seed each layer of the bracket (i.e. players who have the same number of bye rounds) as if they were a tier in the previous round, except that record is considered over Strength of Schedule when applicable. If the player has no opponent (e.g. 10 players in the bracket, 1 and 2 have no opponents in the tier) then those players are slotted solely based on record and strength of schedule.
  • The bracket is then set up in the classic top-plays-bottom style.
  • Seeding is done once - brackets are then set for the rest of the event (except for rematch avoidance).

Later-round rematch avoidance:
  • If a match has a rematch from earlier in the event, swap the bottom player in the matchup with the player directly below that player, by seed, if that does not create a rematch itself. (Lower seed is whoever was effectively the lower seed when the bracket was initially set up.)
  • If it does, instead, try swapping with the next player down.
  • If you reach the bottom of the tier without finding a non-rematch pairing, then swap with the next player up from the lower-ranked player (again, if that does not create a rematch itself).
  • If it does, try swapping with the next player up, and so on.
Example:
Initial MUs are 1A, 2B, 3C, 4D.
Say 3 vs. C is a rematch. Try 3 vs. D. If 3D and 4C are both not rematches, make that switch.
If one of them is, try 3B and 2C.​
 
Last edited:
Any thoughts on implementing these rules for pair up/down for round 4 of the current event?
 
I finally looked at them close enough to give an opinion. Yes, I like. Good work. :up:
 
Well, it ended up not mattering this go-round, as there are 4 3-0 players and 8 2-1 players. But we'll go with these rules for future events, barring further announcements.
 
We've decided to change our Strength of Schedule metric, starting in season 15, as the current one arguably places too much emphasis on the more experienced opponents you've faced when calculating your strength of schedule. The new approach, instead of using inverse-variance weighting, will be derived by averaging the means and variances of all of your opponents, and backing out a ranking from there.
 
Just a heads up that these rules will probably be changing next season. We have noticed some perverse effects in the way these SoS-based matchups play out, and more than one person has pointed it out.

We'll figure it out - we already have a basic sketch of a fix, just trying to figure out if it's the best way to go. If you want to chime in feel free.
 
Last edited:
Obviously this topic is quite meaningful to the community hence all the chatter, but alright I'll play along.

Just a heads up that these rules will probably be changing next season. We have noticed some perverse effects in the way these SoS-based matchups play out, and more than one person has pointed it out.

Do tell about these 'perverse effects'. sounds naughty.

It seems to me that the ranking systems have done what they were supposed to be doing. Those who get ahead on the SoS (almost always someone who pulled off 1-2 upsets in the first two rounds) gets matched up with the worst ranked of the lower SoS schedule.

I always thought the problem with that is that it tends to do the same thing. The lower ranked players have high SoS and the higher ranked players have low SoS so they wind up getting matched up against each other anyway.

One way around that I can think of is to solely reward the top player in SoS. (or at least give them primary priority) Everyone except the top SoS player gets ranked by their online ranking and the bottom player is matched up against top SoS. Then you repeat the process with those 2 players eliminated from the list. (so the 2nd ranked SoS gets matched up with the worst remaining ranking...unless the 2nd ranked SoS was already the worst ranked player and got matched up with the #1 SoS player. That means #3 SoS would get the lowest ranked player left....confused yet?)
 
confused yet?
Sorry to disappoint, but given that you've actually suggested one of the options I've put forward internally, I was able to follow it.

The issue arises when the top half SoS players in a tier all (or mostly) have lower rankings than the bottom half SoS players. When that happens, the pairings that round will actually serve to further exacerbate the SoS divide (because the high ranked, low SoS players get the weaker opponents, while the low ranked, high SoS players get stronger opponents).

The approach you suggest gets rid of the worst case scenarios, but it doesn't solve everything. Example: One player has the highest SoS and ranking, and the next-highest SoS belongs to the player with the lowest ranking. While the #1 SoS player is rightfully rewarded with the easiest matchup, the next-highest player is now pushed into a matchup that will further ratchet up his high SoS.

I've tossed out some other options that get rid of these sorts of corner cases, although they don't have quite the elegant simplicity of the approach you suggested.
 
Assign each player a rating based on performances against various opponents, weighted such that you gain more for beating stronger opponents, and lose more for losing to weaker opponents. Initiate a metric by using historical strength of schedule data. For each win, you gain (for instance) 10+x, where x=[some function based on the difference between your rating and your opponent's, and you can't gain <1 (hypothetically (rating difference)/10 or something)], and something similar for losing.

Maybe assign everyone the same rating, dated Jan. 1 2012 (or whenever is the earliest start date), and run the formula forward from there. So you had a 1600, like everyone else, on 1/1/12. Then on June 5, 2012, you beat Cap, who (like everyone) had a 1600 rating. You would get 10+x, where x=[(no rating difference)/10 = 0], so your rating would become 1610.

Once everyone has a rating, maintaining such a system is easy.

Ratings in hand, you then take each new tournament and lay out all the players in order by rating. In a tournament of 16, have 1 play 8, 2 play 9, and so on. After each round, sort by wins & losses within the tournament: 1-0, 3-1, whatever. As you already do. Within each category, sort (again) by rating. Then, of the 4 (hypothetically) players who are 2-1, have 1 play 3 and 2 play 4. Got it? And so on.

New players will enter the system with a predetermined rating, which will go up or down quickly as their performance dictates.

You can call this system the Universal Scaper Championship Formula. It'll work! And I invented it! :)
 
Assign each player a rating based on performances against various opponents, weighted such that you gain more for beating stronger opponents, and lose more for losing to weaker opponents. Initiate a metric by using historical strength of schedule data. For each win, you gain (for instance) 10+x, where x=[some function based on the difference between your rating and your opponent's, and you can't gain <1 (hypothetically (rating difference)/10 or something)], and something similar for losing.

Maybe assign everyone the same rating, dated Jan. 1 2012 (or whenever is the earliest start date), and run the formula forward from there. So you had a 1600, like everyone else, on 1/1/12. Then on June 5, 2012, you beat Cap, who (like everyone) had a 1600 rating. You would get 10+x, where x=[(no rating difference)/10 = 0], so your rating would become 1610.

Once everyone has a rating, maintaining such a system is easy.

Ratings in hand, you then take each new tournament and lay out all the players in order by rating. In a tournament of 16, have 1 play 8, 2 play 9, and so on. After each round, sort by wins & losses within the tournament: 1-0, 3-1, whatever. As you already do. Within each category, sort (again) by rating. Then, of the 4 (hypothetically) players who are 2-1, have 1 play 3 and 2 play 4. Got it? And so on.

New players will enter the system with a predetermined rating, which will go up or down quickly as their performance dictates.

You can call this system the Universal Scaper Championship Formula. It'll work! And I invented it! :)

@Dad_Scaper: Have you read this thread? :lol:
 
Heh.

No, I had not.

If you already have rankings, then adopting my suggestion for pairings is easy-peasy. I'd do it locally, but I wouldn't force rankings on my ftf buddies. Or their kids. ;)

Just abandon strength of schedule as a factor. Ratings are a substitute for it, for the purpose of pairings. The only reason why SoS is important to the FTF scene is because there aren't ratings in it.
 
Assign each player a rating based on performances against various opponents, weighted such that you gain more for beating stronger opponents, and lose more for losing to weaker opponents. Initiate a metric by using historical strength of schedule data. For each win, you gain (for instance) 10+x, where x=[some function based on the difference between your rating and your opponent's, and you can't gain <1 (hypothetically (rating difference)/10 or something)], and something similar for losing.

Maybe assign everyone the same rating, dated Jan. 1 2012 (or whenever is the earliest start date), and run the formula forward from there. So you had a 1600, like everyone else, on 1/1/12. Then on June 5, 2012, you beat Cap, who (like everyone) had a 1600 rating. You would get 10+x, where x=[(no rating difference)/10 = 0], so your rating would become 1610.

Once everyone has a rating, maintaining such a system is easy.

Ratings in hand, you then take each new tournament and lay out all the players in order by rating. In a tournament of 16, have 1 play 8, 2 play 9, and so on. After each round, sort by wins & losses within the tournament: 1-0, 3-1, whatever. As you already do. Within each category, sort (again) by rating. Then, of the 4 (hypothetically) players who are 2-1, have 1 play 3 and 2 play 4. Got it? And so on.

New players will enter the system with a predetermined rating, which will go up or down quickly as their performance dictates.

You can call this system the Universal Scaper Championship Formula. It'll work! And I invented it! :)
Heheh, pretty sure you didn't invent that one.

At least, it reminds me of the system used in Ladder-based play like I see in Battle for Wesnoth and Age of Kings HD, among others.

--

A ladder system would have the (possible) added benefit(?) of letting players play independent, competitive games. Not to mention a way to compare players' skill-levels by some other means than W/L ratio or ranking in a table.
 
My suggestion - the Universal Scaper Championship Formula - was completely my own invention! It was largely offered tongue-in-cheek, though. You guys have this well in hand, and I don't participate in the online scene. I am sure dok and the others behind the curtain know what the USCF system is like and they are aware of its virtues and drawbacks for this group.
 
dok said:
If a match has a rematch that we want to avoid, swap the bottom player in the matchup with the player directly below that player, if that does not create a rematch itself.

Could you clarify 'directly below that player' ? For example if the Final Four is

#1 vs #13
#14 vs #15

But #1 vs #13 is a rematch.

Does #13 switch with #14 because that is the seed ranked directly below him? or are they reseeded for re-pairing purposes such as (#1=#1, #14=#2, #15=#3, #13=#4) so then #13 switches with #15?
 
the latter
 
Last edited:
Updated version in the first post.

I know it looks quite complex. I want to emphasize that most of the complexity is there to cover some peculiar corner cases. The core approach is not that tricky.

Super cliff's notes version:

  • Round 1 is now totally random (except avoiding recent rematches)
  • Later rounds will now attempt to pair the people who have had the toughest schedules up to that point in the event with the lowest-ranked available players.
 
One additional addenda to these rules:

By random chance, the only two completely new players (zero online games) in a field of 24 players were set to play each other in round 1 of season 17. We decided on the fly that this was not in the interest of the event, so we treated that as a "rematch from the previous two seasons" and used standard rematch avoidance. We have decided that that will be official policy moving forward.
 
A minor tweak to Strength of Schedule calculations this season (18). When adding a player's ranking to your Strength of Schedule, if their rating is lower than the starting new player rating, we will use the starting new player rating instead. Additionally, if you receive a bye or a forfeit win, your strength of schedule will have this same lower baseline averaged into it.

There's a good chance that we will debut a completely new Strength of Schedule measure starting next season that will eliminate the need for these sorts of heuristic tweaks, but more testing and observation is needed on that.
 
There's a good chance that we will debut a completely new Strength of Schedule measure starting next season that will eliminate the need for these sorts of heuristic tweaks, but more testing and observation is needed on that.

After reviewing the new SoS measure internally for a while, we've decided to go with it for future seasons.

You will see it when standings post in season 19, but the basic gist of it is that your SoS is determined by the expected performance of an unknown new player against your schedule. In order to make high SoS=better, the way we're displaying it will be the expected winning percentage of your slate of opponents against a new player. So, if your SoS displays as 60%, then that means the ranking algorithm would guess that your slate of opponents would have won 60% of their games against a set of unknown new players.

(This means that byes and forfeit wins are very bad for your strength of schedule, because an unknown new player wins 100% of the time against "bye".)
 
Two changes to our pairing rules that we have agreed on internally for some time, but never announced publicly:

  • Our previous bye policy was that lowest-ranked player in the bottom tier (who has not already received a bye/forfeit this event) receives the bye. Our new policy is that the bye is given to a randomly chosen player among all bottom-tier players (who have not already received a bye/forfeit this event).

  • The pair-up player is no longer automatically the lowest-SoS player in the tier. Instead, every player from that tier is available to be paired with the active player ("Player A" in the description of the algorithm) in the tier above, until a pair-up is chosen. Players with top-half SoS in their tier are schedule-protected as usual.

The OP will be updated to reflect these changes soon.
 
Last edited:
I added a small update here to include an explanation of the SoS system we've been using for a while now.
 
Small change to the pairing rules:

Previously, for the first two rounds of an event, you were shielded from playing a rematch with someone you had played in either of the previous two events. While this is still the case for round 1, in round 2 the "look-back" period is now reduced to one event. So you could play someone you had played two events prior in the second round.
 
A small tweak - we are changing our pair-up protocol. It used to be:
When a player needs to be paired up from this tier, every player from that tier is available to be paired with the active player ("Player A" in the description of the algorithm) in the tier above, until a pair-up is chosen. Players with top-half SoS in their tier are schedule-protected as usual.
But now it will be:
When a player needs to be paired up from this tier, one is chosen at random from the bottom-half SoS players in the tier. A player cannot be paired up twice in the same event.
 
Another minor update. 3 loss players can no longer be paired up into games against 2-1 players.

EDIT: super-minor update that doesn't warrant another post: for pair-ups from 1-loss tier, the median player by SoS is eligible to be paired up (effective starting season 47).
 
Last edited:
Back
Top