In this year’s competition, the format changed from a jury selection to a popular vote.
We’re all used to the First Past the Post (FPTP) voting method or some variation of it, where every voter gets one ballot where they choose one option. All votes are tallied and the candidate with the most votes wins. This intuitively seems like a good system, but it has a lot of proven and demonstrable problems. CGP Grey has an excellent video on this topic.
The problem we’re solving
If all the voters vote their true judgement, the most likely outcome is for a minority to rule. If a candidate wins with 30% of the vote, it means that 70% of the voters, the majority, doesn’t agree with the winner. Moreover, since you can only pick one option, a lot of voters choose instead to vote tactically. Instead of voting sincerely for the candidate they prefer the most, they vote insincerely for other candidates in the hopes of helping their true prefered option. In FPTP, they’d vote for the candidate that has the most chances to win against the candidate they dislike the most.
In essence, this method fails to reveal the majority’s true preference and asks people who’s the “lesser of two evils”. We have more options to chose from. Let’s not do this. What other methods do we have to chose from, then? Plenty! In fact, there are way too many voting methods for us to discuss here. I invite you to watch PBS Infinite Series’ episode on voting methods, and explore the subject a bit more on Wikipedia if you feel like it.
Gibbard and Satterthwaite proved in the early 1970s that, for every voting system, we have to accept at least one of the following:
- There’s only one relevant voter
- There’s only two alternatives
- It’s possible to do tactical voting
We’re always going to have more than one voter, and we’re always going to have more than one team competing. Therefore, we’re always going to have tactical voting. Major bummer. But, let’s not despair! As someone notable in this field once said: “Most systems are not going to work badly all of the time. All I proved is that all can work badly at times.”
After scouring the Internet, we settled for a variation of the Schulze Method. It’s a popular method used in several open source organizations. The way it works is each voter has one ballot where instead of choosing a single option, they can rank all candidates by order or preference. However, instead of trying to answer the question of “who is the most popular choice?”, it tries instead to answer to “who is the most preferred choice?”. This is the Condorcet criterion: the winner is the person who would win a two-candidate election against each of the other candidates. It makes things a bit counter intuitive to wrap your head around, but we believe that’s a better question to ask.
Since politics and voting methods aren’t hot topics and most people are only familiar with popularity based methods (like FPTP), it seemed too much of a burden to require people to fully understand it. Instead of giving the voters the complete list of candidates to rank, we’ve implemented an UI based around the concept of a podium, where the voter could rank their first 3 prefered candidates. Voting in A > B > C would be translated to the voter preferring the A team over B, B over C and C over everyone else.
Diving deep into the maths
Alright, let’s make up an example where we can exercise our method. We’re going to limit the example to just three options, A, B and C, and we’re going to have 20 voters. In order to have a better grasp over the overall vote, we’re going to use table representations. Using a B > A > C vote from one person, we can express it in table form as follows:
The way to read this is, for any given cell, the option in the first cell of that line when going against the option in the first cell of that column. If you had to say this out loud, you’d say that 0 people prefer A over B, 1 person prefers A over C, 1 person prefers B over A, etc. You get the point.
Things are easy when we’re thinking about the preferences of just this one person. However, when we consider the votes of many, we have to think about the transitivity of choice. Let’s say we sum the votes our 20 voters and end up with the following table:
If we want to know who wins between A and B, just from looking at that table, we’d be tempted to say it’s B. We can read that 5 people prefer A over B, and 15 people prefer B over A. B should be the winner, right? Well, we actually have more info that we can use. Remember that we want to isolate a pair of candidates and understand how people would vote if they had just that one choice to make. Let’s take a look at how C can change this. 20 people prefer A over C, and 20 people prefer C over B. Therefore, it stands to reason that 20 people prefer A over B! A actually wins when compared to B if we look at people’s preferences for C!
If we rewrite our table to take transitivity for everyone into account, we get to the new following table:
The more algorithmically inclined reader will recognize this as the Floyd Warshall algorithm, that calculates the widest path between each pair of nodes in a graph.
That last table is a little more crowded than what it could be. Since we know how each pair fares, let’s replace the numbers with just one letter: W for a win, and blank for a defeat. This gives us:
For this table we can clearly say that A is the overall winner, followed by C, then B.
A is our winner! Hooray! 🎉
One notable concept we want to bring to the foreground it the Schwarz set.The Schwarz set is the group of candidates that don’t lose to anyone outside that set. Or, less formally, any of the candidates in the set that represent the majority of the population’s will, tying when compared head to head. Typically, this set is composed of only one candidate (in our example, it’s just A), which is crowned the winner, but that’s not always the case. If there are multiple candidates in the Schwartz set, we still need to pick a single winner from this set. Since we’re at a stalemate, we’ve decided to resolve tie breaks using a random number that was assigned to each team before the opening of the voting process.
Looking back on that decision, while it’s mathematically and statistically valid, we understand that losing to a coin flip can be very frustrating. In next year’s edition, we’re considering the possibility of adding an FPTP round to solve ties between the members of the Schwarz set, and only then fall back on randomness.
For the participants of this year’s edition, we encourage you to go to your dashboard in the Make or Break platform, download the voting data (info_start.json and info_end.json), and run the voting process to audit the results by yourself. We’ve open sourced our API code and there you’ll find a script that runs the voting process and outputs all the relevant information.
What about those funny papers we were handed?
Since we also wanted to give the opportunity to visitors and guests to cast votes without the burden of creating an account in our system, we’ve created redeemable physical votes with a unique system ID encoded into a QR code to ensure there wasn’t any duplication fraud. The guests would give to their prefered candidate in each category which would in turn give them to the organization to be redeemed. Those votes were less expressive, since they would be translated to the voter preferring a candidate over everyone else in our voting method.
Uff, that was a whole lot of voting!
Yeah, we know, but we wanted to share where we got to when we’ve tried to implement a fair, transparent and auditable voting method. As with every project, some of the implementation decisions can and should be questioned and we encourage every past and future participant to reach us through any communication channel to ask questions and/or suggest improvements.