This is an implementation of an instant-runoff voting algorithm. Instant-runoff voting is a fairer alternative to the “first past the post” algorithms usually employed to elect candidates, which often forces candidates to vote for the least objectionable of two main candidates. Instant-runoff voting allows users to vote for their favorite candidates without risk of “wasting their vote”.
In instant-runoff voting, each voter may submit a list of candidates ordered by preference. The election then proceeds in rounds, where each voter’s top choice receives the voter’s vote for that round. The candidate with the least number of votes is eliminated and a new round instantly begins. The votes of all voters who had placed the eliminated candidate at the top of their list now go to the next candidate on their list (if any), and the votes are re-tallied and a candidate is again eliminated.
As a simple example, imagine an election with two major party candidates, James Smith and John Doe, and a minor independent party candidate, Jane Bloggs. Your ideal candidate is Jane Bloggs but you believe that she has very little chance of winning the popular vote. If you are afraid of James Smith winning the election then with a first-past-the-post system you may feel that you must vote for John Doe to ensure that James Smith doesn’t win. This effectively eliminates any chance of Jane Bloggs winning and you end up locked in a two-party system that doesn’t represent the candidates.
With instant-runoff voting, your ballot would instead look like this:
1. Jane Bloggs
2. John Doe
When the votes are tallied, the results may be
James Smith: 10535
John Doe: 10034
Jane Bloggs: 692
Rather than giving the election to James Smith, Jane Bloggs is eliminated and all votes for her are redistributed to the second choice (if there is one). After re-tallying, the results may be
James Smith: 10572
John Doe: 10615
In this round, James Smith is eliminated and John Doe wins the election.
The script includes comments that explain each aspect of the algorithm. If you find a bug, please report it.
The script provides a number of functions for performing instant-runoff voting and can be installed as a module. I will likely package it at some point.
The script uses python3-tabulator to display data in tables.
This output was generated by the random election demo.
1: Standard Election Round
Candidate Votes Support by Voters Support by Population Status
----------- ----- ----------------- --------------------- ----------
Candidate 1 788 19.61% 15.76%
Candidate 2 833 20.73% 16.66%
Candidate 3 794 19.76% 15.88%
Candidate 4 832 20.70% 16.64%
Candidate 5 772 19.21% 15.44% eliminated
----------- ----- ----------------- --------------------- ----------
2: Standard Election Round
Candidate Votes Support by Voters Support by Population Status
----------- ----- ----------------- --------------------- -------------------
Candidate 1 933 23.21% 18.66% tied for last place
Candidate 2 969 24.11% 19.38%
Candidate 3 933 23.21% 18.66% tied for last place
Candidate 4 989 24.61% 19.78%
----------- ----- ----------------- --------------------- -------------------
2.1: Last Place Elimination Round
Candidate Votes Support by Voters Support by Population Status
----------- ----- ----------------- --------------------- ----------
Candidate 1 1495 37.20% 29.90% eliminated
Candidate 3 1509 37.55% 30.18%
----------- ----- ----------------- --------------------- ----------
3: Standard Election Round
Candidate Votes Support by Voters Support by Population Status
----------- ----- ----------------- --------------------- ----------
Candidate 2 1206 30.01% 24.12%
Candidate 3 1106 27.52% 22.12% eliminated
Candidate 4 1213 30.18% 24.26%
----------- ----- ----------------- --------------------- ----------
4: Standard Election Round
Candidate Votes Support by Voters Support by Population Status
----------- ----- ----------------- --------------------- --------------------
Candidate 2 1526 37.97% 30.52% tied for first place
Candidate 4 1526 37.97% 30.52% tied for first place
----------- ----- ----------------- --------------------- --------------------
4.1: Tie Breaker Round
Candidate Votes Support by Voters Support by Population Status
----------- ----- ----------------- --------------------- ----------
Candidate 2 488 12.14% 9.76% eliminated
Candidate 4 518 12.89% 10.36%
----------- ----- ----------------- --------------------- ----------
5: Final Tally Round
Candidate Votes Support by Voters Support by Population Status
----------- ----- ----------------- --------------------- ------
Candidate 4 2044 50.86% 40.88% winner
----------- ----- ----------------- --------------------- ------
File | Size | Last Modified |
---|---|---|
instant_runoff_voting.py | 18.59 KiB | 2016-05-05 00:44 UTC |