+-----------------------------------------+
| The Single Transferrable Vote Algorithm |
+-----------------------------------------+
Problem: M voters must elect K of N candidates.
Input: M x N matrix, Tbl, of votes.
Tbl(i,j) = p, 1<=p<=N,
means that voter i gave preference p to candidate j.
Every voter assigns to each candidate a unique number from
1 (highest preference) to N (lowest preference).
(A voter may assign only the first n < N preferences. In
that case, the other N-n candidates receive a preference of N.)
Weakest candidate:
The candidate with the fewest votes of preference 1.
Ties are broken by fewest votes of preference 2, then 3, etc.
Output: List of K elected candidates in order of election.
Redistribute(n, Tbl):
for v <-- 1 to M
p <-- Tbl(v,n) {* v's preference for candidate n *}
for c <-- 1 to N
p' <-- Tbl(v,c) {* v's preference for candidate c *}
if p' > p then decrement Tbl(v,c) by one
end for
end for
Now remove candidate n from Tbl {* column n *}
Procedure STV
Elected <-- empty
T <-- Tbl {* Start with the original vote matrix *}
for E <-- 1 to K
N' <-- N-E+1 {* Choose a winner among N' candidates *}
T' <-- T {* store the current vote matrix *}
while (no candidate has a majority of 1st preferences)
weak <-- weakest candidate
Redistribute(weak, T) {* remove weakest *}
end while
win <-- the majority candidate
Elected <-- append(Elected, [win])
T <-- T' {* restore back to N' candidates *}
Redistribute(win, T) {* remove winner & redistrb. votes *}
end for
End STV