Proportional Runoff Algorithm

On this page, I want to present an idea for a simple vote counting system producing proportional rankings. It is also possible to use the system as a replacement for STV (single transferrable vote), by using the first ranks up to the number of seats.

Design criteria


Each ballot contains an ordered list of candidates. We only consider candidates, which are stated at least on one ballot.

Let Q be a big integer constant, e.g. 1000000. Proceed as follows:

  1. All candidates, except those which are not stated at least on one ballot, are marked as unseated.
  2. All unseated candidates are marked as remaining.
  3. The score of all candidates is set to zero.
  4. For each ballot: Determine the first remaining candidate on the ballot and increase its score by one.
    Ignore those ballots, which do not contain any remaining candidate.
  5. Repeat step 4, until at least one candidate has a score greater than or equal to Q.
  6. Remove all candidates with a score greater than or equal to Q from the remaining candidates.
  7. Repeat steps 4 through 6, as long as there is more than one remaining candidate.
  8. If there is one remaining candidate, then this candidate is seated, starting from the worst rank.
    If there is no remaining candidate, then tie-breaking is needed between those candidates which have been removed during the last application of step 6.
  9. Steps 2 through 8 are repeated until all candidates but one have been seated.
  10. The last unseated candidate gets the seat with the best rank.

Software implementation

The following versions implement an old version of the algorithm:

Example case

Log of counting:

No candidates without votes.
Unseated candidates: A; B; C
Scoring: A (0+333334*2=666668); B (0+333334*2=666668); C (0+333334*3=1000002>=1000000)
Remaining candidates: A; B
Scoring: A (666668+66667*2=800002); B (666668+66667*5=1000003>=1000000)
Remaining loser: A
Assigned rank #3 to: A
Unseated candidates: B; C
Scoring: B (0+250000*4=1000000>=1000000); C (0+250000*3=750000)
Remaining loser: C
Assigned rank #2 to: C
Assigned rank #1 to: B

Feedback wanted

I'd appreciate feedback on this idea (see Kontakt).

(published 2013-03-14, updated 2013-03-17)

Back to main page