Stupid Match Algorithm Tricks, 2018


The problem is that an algorithm like this wouldn’t be very helpful for ranking teams correctly. From the perspective of a team like 254/1114/1678/etc, why should every match they play be with two nonmoving robots to “balance” the schedule?


Not only would this be unfair to elite teams, “balancing” the schedule would destroy any chance of having the top 8 seeds be a reflection of the top 8 teams at the event. If every match is balanced to be roughly 50% odds for each alliance to win, the top 8 seeds are basically randomly selected (in a game without bonus ranking points). That would be, and historically has been, bad for the competition when the top 8 is badly goofed up.


We also noticed some weird stuff at Tech Valley Regional.

We played against 5149 three times in quals and with them none. We played against 1493 three times in quals and with them once.

Also strange, we watched match 45 from the queue line to see how our partners in our subsequent match, match 49 were playing. Match 45 contained the alliance 333-3044-5943. In match 49, our alliance was 333-3044-20. Seemed real fishy when we noticed that.

I think it may have something to do with being “in phase” with another team in the schedule as they try to optimize match cycles for teams. Our 4 matches including 1493 all occurred in the first half of the tournament, and our 3 matches against 5149 all occurred over the span of 5 of our matches in the middle of the tournament. This suggests that perhaps our match-match cycles were “in phase” with these other teams during that stretch of the tournament and perhaps “out of phase” for the rest of the tournament


I think that Carl is on to something here.

If you’re getting the same teams in your match schedule all the time, it probably means the FTA set the “(time/matches) between matches” parameter just a little too long (if it can be set) and all the teams in your current match will be within one or two matches of you coming back through the order. This increases the odds that one or more will be actually in your next match… This would hold true at larger events; at smaller events it doesn’t really matter how long the parameter is you’re going to get a lot of similar-team matchups.



Being from one of the teams you mention, I would appreciate having a balanced match schedule. Facing 2 or 3 powerhouse teams on a quals alliance is never a pleasant experience no matter how good your robot is.

A balance schedule can eliminate the probability that a team will be in “every match they play be with two nonmoving robots”. The easiest way is to rank teams on the basis of “district points”, then divide them up into 3 bins based on these rankings–let’s call them A, B and C. You can then set the schedule so that the A teams never play together, B don’t play together, and C don’t play together. You can also set a rotational schedule so that the A, B and C teams don’t play with each other more than once. (I worked through most of this algorithm, but haven’t gotten back to finishing it.)

If anyone is interested in working on this, I’ll send them my workpapers.


I think it would be really cool if some off-season event did a qual schedule based on a variation of a Swiss tournament structure.

Essentially, the first 3 “rounds” of matches would be determined according to the current algorithm, but the following rounds of matches would be scheduled as the event goes on according to the W/L record or ranking of teams in their completed matches. The highest ranked teams would play against other high ranked teams and the lowest ranked teams would play against other low ranked teams.

The primary advantages to this system relative to the current one would be removal of a lot of schedule luck and more close matches.
The primary disadvantages to this system would be people’s unfamiliarity with it and the fact that you won’t know your whole schedule right away.

If FRC ever decided that they wanted to use this, they would really need to re-think the ranking system. A Swiss system with the current ranking sorts would cause the first few matches of the event to have an unfairly large impact on a team. This is because winning these matches would cause a team to be more likely to be paired with teams that can earn the bonus ranking points and thus be locked into the top-tier of teams without much more effort than a comparable team that loses their first few matches.

If any MN off-season is crazy enough to want to try something like this, reach out to me and I would be happy to make a scheduling program.

[TBA Blog] Schedule Strengths (2 of 3): Historical Schedule Strengths

With 5842 once, against 2 times at 52-team Greater Pittsburgh. Probably a lot more common but eh - I still think a little more variety would be nice.

What I would REALLLLLLY love for a hardcore stats-fan to do is go back and calculate a strength of schedule for each team at every event based on that particular event’s performance metrics.

Qualitatively, I have become very used to knowing in my gut when our “random” schedule is - let’s use a kind word - depressing. But I’d love for someone to quantitatively show me who really got hosed and who really benefited at each event. Use whatever performance metric you want - average OPR of partners vs. opponents - whatever you feel is relevant.

And then go back and do this for every regular season event the past 10 years (or for however far back you have valid data).

And then summarize on which teams have been “cursed” more than others.

Ya know…if ya ain’t got anything better to do with your time. :slight_smile:


If you want to see cursed, look how many regionals 3138 has been in match 1 in the past 3-4 years.


That would be some interesting data. But, the problem with random number generation is that, er, it’s random. You could throw 10 heads in a row, then get 10 tails in a row. Doesn’t mean you didn’t get a 50% split, and doesn’t mean it’s not random, just means that you got some very interesting numbers.

P.S. If you want to see a “cursed” team, may I suggest the Browns? Or is that too soon?


I counted
6 times in Q1
2 times in Q2
1 time each in Q3, Q5, Q7

Since 2013 which was the first time 3134 was in a Q1. Also, 4 times in Q1 since 2016, and only one time not in Q1. That is a lot of Q1’s!


I understand the schedules are “random”. However, given their “randomness”, I want to see which teams have been “cursed” by said “randomness” more than others. Much like, say, the Browns. And Indians. And Cavaliers outside of 2016 when certain cosmic deals were made.

And the Browns are back, baby! Draft capital for dayssssssssssss.


Here’s a set of 212 tables (2 for each event) showing how many times each team played with and against every other team in each event completed as of 3/25/2018 (106 events)](


There are really only two variables that matter in determining match order: Number of teams & Number of qualification matches.

Let’s say that you have an event with 32 teams.and 64 matches. The.match order should be defined well before the event starts. First match: 1, 2, 3 against 4, 5, 6; then 7,8,9 v. 10,11,12, etc… Then, the assignment of teams to numbers is randomized.

The pre-defined match order would be optimized to prevent problems like the one described here, having some teams with more short-turnarounds than others, etc…

There are, what, maybe 100 combinations of # teams/# matches. Just list them all out.


But this could render the sacred algorithm useless.

And you would have to generate schedules for all sorts of events some that have only, say 24 teams and some that have many more. You would need a computer or something for all that input. And in the end we would still need the RNG to assign your team number to an event participant slot. Because we wouldn’t want to gather teams reps together at an event prior to the first match and say, draw a number from the hat to assign teams to a schedule.


Cheesy Arena does this. Posted earlier in this thread:


This is absolutely how it should be done in FRC since the number of possible event sizes and matches per event are so small.




It’s so hard to detect sarcasm on the internet. So, please forgive me for taking you seriously when I have a strong suspicion that you’re being sarcastic.

You are right. You’d have to generate potential schedules like that. But, how many are there? What’s the smallest event this year? What’s the biggest? It’s not like each event has its own format. Formats are pretty consistent. In a 2-day event with 32 teams, you’ll almost certainly have 64 matches. 33 teams – 66 matches.

(Smallest event this year: 26 teams. Largest: 66 teams. That’s a spread of 41. For each size, the number of matches will be in a small range. So, I think my ballpark estimate of 100 is probably pretty good.)

So, (a) come up with a way to give a numerical ranking to a schedule, (b) run the algorithm a million times (assuming that, due to randomization, it’s non-deterministic), © pick the result that gives the best ranking.


From the tables in linked in the quote above, I extracted a summary (attached below) of the “against” matrices

Here’s how to read it:

Row2 says "At the hiho Event, Team 244 played against 4 teams 3 times each, against 8 teams 2 times each, yet there were 13 teams they never played against at all" (119 KB)