SMV compared with Score Sorted Margins, alternative reweighting strategy

I’ve updated code in my github repo:

(I use a linux or Windows/WSL environment with Anaconda python)

In particular, see the code in

My code uses a version of Sequential Monroe Voting as a base, with the option to run a form of Condorcet for each seat.

The main difference from standard Sequential Monroe voting is the reweighting strategy. Instead of using Fractional Surplus Handling for ballots scoring the seat winner exactly at the quota threshold approval rating, I rescale as much as possible based on the rating.

So if maxscore * Quota / Top-quota-score is less than one, I rescale ballots at and above the approval threshold with

Fraction = maxscore * Quota / Top-quota-score
Factor[r] = 1 - r * Ratio

But if the quota is too large, I successively set Factor[r] to zero, from maxscore down to some rating mm:

q = Quota
Sqta = Sum(vScore[v] +… + maxscoreScore[maxscore])
mm = maxscore
ratio = mm * q / Sqta
for rating in maxscore:v in descending order:

  • if ratio > 1:
    Factor[rating] = 0.0
    q -= Score[rating]
    Sqta -= rating * Score[rating]
    mm = rating - 1
    ratio = mm * q / Sqta
  • else:
    Factor[ratio] = 1.0 - rating * ratio

In some cases, this will indeed produce the usual SMV fractional surplus handling.

While this does not strictly preserve standard SMV’s IIA property, it lessens the incentive to strategically lower the score of popular preferred candidates.

Based on initial testing, it appears that SMV and SSMPR get very similar results. I would be interested in trying other examples, however.