Ranked choice voting/Instant Runoff Voting for Taiwan

I’ve been thinking about how to push ranked choice voting for Taiwan and one push back is that many people in Taiwan feel it’s too complicated, and they don’t trust machines counting their ballots.

The goal of ranked choice voting is obviously promote a multi-party system, build on consensus, and end partisanship and divisiveness.

But if the people want the votes to be counted one at a time by 2 officials and allow an audience that can verify the process, going through elimination rounds over and over again is simply way too painful for these “officials” who are nothing more than teachers forced to work on weekends.

So what do we do?

My first thought is do something frequently done in computer science to improve program efficiency, loop unrolling. Instead of having the computer go through the iterations at run-time, waiting until hitting a branch point to know what to do, just flatten the loop out so the compiler and other resource schedulers on the computer know what’s coming and can plan ahead of time.

So instead of

int x;
for (x = 0; x < 3; x++) {

Just do

int x = 0;

The problem is, if you have 10 candidates running, the voters can rank them from one to ten and you want to unroll that, that’s a permutation of p(n, k), where n is 10 and k is 10.

That’s n!/(n-k)! which would be 10! and you would have 3,628,800 different ways to cast your vote. That isn’t going to help at all with reducing workload.

The only way to get the number of permutations down to a manageable size is by limiting the number of candidates that can be on a ballot, and the number of ranks you are allowed to give them.

The only number that seems to be manageable is 5 candidates, and you are only allowed to rank from 1st preference to 2nd preference. That would give you p(5,2), which is 5!/3! and leaves you with 20 permutations for allowed votes.

At this point you could count the votes by putting down all 20 permutations on a board.

A. 12
B. 13
C. 14
D. 15
E. 21
F. 23
G. 24
H. 25
I. 31
J. 32
K. 34
L. 35
M. 41
N. 42
O. 43
P. 45
Q. 51
R. 52
S. 53
T. 54

Then you can begin tallying the votes. An imaginary ballot would look like this:


This particular ballot would be 32, so the first official will call 32, and the second official will call 32, and the third official will add one to J. 32.

By the time all the ballots are counted, and it is obvious no one surpassed 50% in the first round, then it’s extremely easy to figure out who has the least votes in the first run (radix sort). After eliminating that candidate, it is also extrememly easy to figure out who those votes should go to next.

By limiting your ranking options down to 2, you are essentially allowed to pick your favorite candidate, and choose one safety option.

The only down side is you have to come up with a way to limit the numbers of candidates down to just 5.


CGP Grey on YouTube has some helpful videos on the topic of different voting systems, if you’ve not come across them yet.

Are you thinking about something like condorcet?


I think mine is closer to Nicolaus Tideman’s ranked pairs voting.

Except that Tideman’s ranked pairs used graphs to figure out the winner, which is not going to be easy to do by hand in Taiwan’s preferred way of counting.

There’s also the Schulze’s method, which achieves figuring out a single winner in one round of counting without limiting ranking options. So if you have 10 candidates, you can rank from 1 to 10.

This is a great way to run elections if voters have more faith in machines counting their votes, but it’s complex graph computation is again too hard to do by hand.

Why not use blockchain? Immutable and it can be counted by any simple computer. No worry about corruption because everyone would be able to both see and verify the results in real time.

I would love nothing more than a secure blockchain voting system. Sadly, most voters in Taiwan have very low confidence in the government, as well as machines tallying votes.

That’s why there is no electronic voting machines in Taiwan, not even ones that count votes like scoring a multiple choice test.

I think they could be persuaded when they understood every one of them could independently help secure and verify the results. The system could even be peer reviewed on open source distribution platforms before being implemented.

I honestly think that is going to fly over the heads of those who voted against marriage equality, which as we’ve seen last time, was over 50% of the voters.

1 Like

Making voting machines secure is a very difficult problem. There are so many ways to manipulate computer systems. And once manipulated it can be impossible to verify if any manipulation has taken place if the attacker did a good job. Once you are in you can change 10, 100 or one million votes without difficulty.
Block chain is a storage system that can not be manipulated afterwards. It can’t protect from being fed manipulated data from a compromised voting machine.

Voting with pen and paper is a proven concept with a paper trail that can be recounted if needed. Manipulations at scale are extremely difficult not to be discovered.


Yes, this looks totally less complicated to the average punter, you know, the one who needs sandals to count to 20.


Until you have mechanical arms stamping ballots using neural network, making it almost impossible to tell whether or not an actual person cast that vote.

I used an easy example. Imagine in the loop you need to do more than just printing out x, for example compare two changing variables and print out the larger one. For a compiler without optimization a computer wouldn’t know what to print at iteration 3 until it gets there.

For my purpose, I just want to eliminate iterations all together, and avoid recounting ballots.

You wouldn’t need voting machines. That’s the beauty of it.

1 Like

I’ve been trying to relay this for a few months to my friend in the MP’s office. Instant runoff voting for president could really help push the Taiwan narrative as well as bringing the most palatable candidate to the office.

Unfortunately, right now is campaign season so they’ve said they’ll resume hearing my concerns after the election.

1 Like

Wanted to discuss ranked-choice voting in general, not specific to Taiwan, but I’m left with the Andrew Yang thread or here.


Andrew Yang talk about the importance of ranked choice voting to solve the poisonous partisanship duality issue.


So, I talked a lot about ranked choice voting. I’ve been thinking how to implement it into daily lives and to something that people might be able to use.

So I created a mock Bird of the Year 2021 election template, and written the google form, and coded vote counting in google colab.

Election Form

Template for the Election Form

Google sheet result

Google Colab code

Ranked-choice / IRV Results:
Candidate Votes Status

[D. Swinhoe’s pheasant] 3 Hopeful
[B. Taiwan blue magpie] 1 Hopeful
[C. Mikado pheasant] 1 Hopeful
[A. Black-faced spoonbill] 1 Hopeful
[E. Formosan Whistling Thrush] 1 Rejected

Candidate Votes Status

[D. Swinhoe’s pheasant] 3 Hopeful
[C. Mikado pheasant] 2 Hopeful
[B. Taiwan blue magpie] 1 Rejected
[A. Black-faced spoonbill] 1 Rejected
[E. Formosan Whistling Thrush] 0 Rejected

Candidate Votes Status

[C. Mikado pheasant] 4 Elected
[D. Swinhoe’s pheasant] 3 Rejected
[B. Taiwan blue magpie] 0 Rejected
[A. Black-faced spoonbill] 0 Rejected
[E. Formosan Whistling Thrush] 0 Rejected

I originally referenced rrosasl’s post on medium, but I found issues with that implementation, so I ended up using the pyrankvote python library, and only adopted the sankey graph portion from rrosasl’s post, which I think he also got it somewhere else.

The bottom of the code includes ways to elect more than one seat/option at a time.


Man, screw pheasants! Write in cobra for the win! Make taiwan great again!

In all honesty your post looks incredibly elaborate and quite well thought out but i am ashamed to say i dont get it :frowning:


If you look at the Google sheets link, originally there were 7 voters.

3 of them voted for Swinhoe’s pheasant as their first choice. The other 4 birds each got one voter selecting them as their first choice.

In the traditional first past the post voting system, Swinhoe’s pheasant would have won.

However, in the ranked choice voting system, a candidate has to have over 50% of the votes to win. With 7 voters that means the winner has to have 4 votes.

Votes that went to the candidate with the least amount of votes in the first round gets transferred to their second choice, until one candidate has 4 votes.

The algorithm used in pyrankvote can be found here:

There are other rank choice voting websites that let’s you create your own ballot, but you would have to pay if you want to limit each account to one vote.

With Google sheets, I can choose to use Google account as the authentication to limit one account to one vote. Although I disabled that in the template. You can also let people modify their votes before a certain time. The only function missing is to not rank choices you don’t like.

I wrote this because I am trying to get my building’s management committee to adopt ranked choice voting. Each tenant can submit a Gmail account to represent their household.


As far as I understand, @hansioux is offerring some tools to anyone interested to use in any votings they might organize: which pub do we go for drinking tonight? Who will become president of the pheasant haters club? Everyday things.

These tools use a special way to count votes, which is supposed to be fairer than the traditional “guy with most votes wins” way. It is supposed to give a better result, eg. represent the wishes of the voters more clearly.

Most importantly for me, it encourages to not vote strategically - meaning the voters need not fear their vote is “lost” in case they prefer a candidate or option projected to not get a majority.

How is this good? In a system with two major parties, like Taiwan, US, …, minor parties have a hard time breaking through. This is because anyone voting for them is (kind of, or at least feeling like) giving up their chance to influence which one of the two big ones wins. So if everyone expects one of the two big ones wins anyway, they don’t want to “waste” their vote on a small option - even if that option fits their preferences best. So, often the “lesser evil” wins, with no chance of real improvement through a third option.

Ranked-choice voting effectively allows voters to vote their actual preferences instead of having to vote strategically. This would have a meaningful impact on elections and governing. It would empower independent and third party candidates by eliminating the “wasted vote” argument


Exactly. With first past the post voting, a two party duopoly is guaranteed mathematically, especially if you don’t even have any kind of propositional representation baled into the election.

As a result, both parties can neglect the majority of the voters, since they are basically hijacked by the duopoly. The candidates only need to appeal to the most radical during party primaries.