[EM] Score Sorted Margins + Sequential Monroe Voting (python code)

Ted Stern dodecatheon at gmail.com
Fri Jun 5 11:41:58 PDT 2020


There's been some discussion on the Election Science Forum about different
methods for doing PR with 0 to 5 score ballots.

https://forum.electionscience.org/t/wolf-committee-results/519/90

One of the methods discussed there is called Sequential Monroe Voting.

https://electowiki.org/wiki/Sequential_Monroe_voting

The motivation behind this method is a paper by B. Monroe back in the '90s,
but the gist of it is that each candidate is measured by their total score
within only the top quota of votes, and then one quota of weight is removed
from ballots that score the winner at or above the quota threshold rating.

Parker Friedland's original statement of the method rescales
ballots strictly above the threshold rating to zero, and for that portion
of the quota-weight still remaining, reweights the at-threshold rating
ballots accordingly.

While this technique follows the motives of Monroe's paper, I feel that it
gives voters an incentive to give lower ratings to popular candidates in
their faction.  But reweighting all ballots with a uniform factor (as in
ER-Bucklin quota threshold approval PR) takes no account of the strength of
support.

As a compromise, I propose the following:

Given, for a given candidate,

S[r] = weighted total of ballots giving candidate a score of r

TS[r] = maxscore * S[maxscore] + ... + r * S[r], the total score down to
rating r

TA[r] = S[maxscore] + ... + S[r], the total approval from max down to
rating r

R = maximum r at which TA[r] is >= quota

Then if maxscore * quota <= TS[R], reweight each ballot scoring the seat
winner at rate r >= R using the following factor:

Factor[r] = 1.0 - r * maxscore * quota / TS[R]

Otherwise, set M to maxscore, Q to quota, and TT to TS[R].

Factor[1 to Maxscore] initialized to 1.0

for r = Maxscore to R in descending order,
    if M * Q > T,
        Factor[r] = 0.0
        M = r - 1
        TT = TT - M * TS[r]
        Q = Q - TS[r]
     else:
         Factor[r] = 1.0 - r * M * Q / TT

When the quota is a small enough fraction of the seat winner's normalized
score, ballots are reweighted in direct proportion to the score at and
above R. But if the top quota score is too small, ballots with high rates
above R are deweighted completely, until the remaining portion to deweight
is small enough for proportional reweighting again.

Just to clarify, it is important to understand that TS[R] is not the same
as Sequential Monroe Voting's top quota score -- the latter is defined as

TopQuotaScore = TS[R] - R * (TA[R] - quota)

Using this reweighting strategy, I wrote some code to implement Sequential
Monroe Voting. For comparison, I combined this method with Score Sorted
Margins, using SMV's top quota score as the seeding and marginal metric.

You can find this code as ssmpr.py in
https://github.com/dodecatheon/approva-sorted-margins/

Either SMV or SSM is Droop proportional when using the Hagenbach-Bischoff
quota (Total votes / Num seats - 1), though I think the Hare quota is
preferable.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.electorama.com/pipermail/election-methods-electorama.com/attachments/20200605/abb35d4a/attachment.html>


More information about the Election-Methods mailing list