# Reweighted range voting

"**Reweighted range voting**" (also possibly referred to as **reweighted score voting**) is one of many cardinal proportional representation voting systems. It is a multi-member system (and a variant on score voting) designed as a natural extension of the Webster or Jefferson Method to a multi-member system. If two-level score (i.e. "approval voting") ballots are used then it reduces to sequential proportional approval voting ("SPAV"). It is therefore one of the three extensions of sequential proportional approval voting to score ballots along with sequential proportional score voting and single distributed vote.

## Procedure

Each voter submits a ballot which, for each candidate, indicates a numeric score which is less than or equal to some maximum number MAX.

Each ballot is given an initial "weight" of 1.

- The highest scoring candidate wins the first seat.
- When a candidate wins, all ballots supporting that candidate are then reweighted, resulting in reduced vote weight going forward for voters who have successfully helped to elect a candidate. This reweighting happens in proportion to the amount of support given in order to ensure that all voters have an equitable amount of influence on the election
**Reweighted ballot = 1/(1+SUM/MAX), where SUM is the sum of the scores that ballot gives to the winners-so-far**

- The remaining candidate with the highest total reweighted score wins, and the process is repeated until all available seats have been filled.

See Reweighted Range Voting for more details (some of the wording on this page is taken from there).

## Reweighting variations

One variation is to use the reweighting formula 1/(1 + SUM/MAX). This variant reduces to D'Hondt when voters vote on party lines.

Another variant is to use the reweighting formula 0.5/(0.5 + SUM/MAX), or equivalently, 1/(1 + 2*SUM/MAX). This variant reduces to Sainte-Laguë when voters vote on party lines.

There is an infinite number of variants that all use the following formula: K/(K + SUM/MAX) where ½≤K≤1. The two above formulas are special cases for when K equals 1 and ½.

## Method variations

A 5-STAR variation in which a final runoff is performed for the last seat available has been proposed in order to incentivize voters to more honestly express their preference order and degree of support.

Each voter submits a ballot in which candidates are scored from 0 (worst) to 5 (best.)

Each ballot is given an initial "weight" of 1.

- The highest scoring candidate wins the first seat.
- When a candidate wins, all ballots supporting that candidate are then reweighted, resulting in reduced vote weight going forward for voters who have successfully helped to elect a candidate. This reweighting happens in proportion to the amount of support given in order to ensure that all voters have an equitable amount of influence on the election
**Reweighted ballot = 1/(1+2*SUM/5), where SUM is the sum of the scores that ballot gives to the winners-so-far**

- The remaining candidate with the highest total reweighted score wins each seat available- up until the final seat up for election.
- For the final seat available, the two highest-scoring candidates remaining runoff, with the candidate preferred (scored higher) by more reweighted ballots winning the final seat.

## Example code

Below is some example code, written in Python and posted by User:Fsargent:

```
import pandas
ballots = [
{"Red": 5, "Green": 0, "Yellow": 3, "Blue": 5},
{"Red": 5, "Green": 0, "Yellow": 0, "Blue": 4},
{"Red": 0, "Green": 5, "Yellow": 0, "Blue": 1},
{"Red": 1, "Green": 2, "Yellow": 4, "Blue": 3},
{"Red": 1, "Green": 0, "Yellow": 2, "Blue": 0},
{"Red": 1, "Green": 3, "Yellow": 0, "Blue": 1},
{"Red": 0, "Green": 0, "Yellow": 5, "Blue": 0},
{"Red": 5, "Green": 0, "Yellow": 0, "Blue": 4},
]
seats = 4
seated = []
max_score = max(max(ballot.values()) for ballot in ballots)
#reweight
def reweight(ballot):
seated_scores = [
ballot[candidate] for candidate in ballot if candidate in seated
]
weight = 1/(1+sum(seated_scores)/max_score)
return {candidate: weight*ballot[candidate] for candidate in ballot}
def nextRound(ballots):
reweightedBallots = [reweight(ballot) for ballot in ballots]
winner = pandas.DataFrame(reweightedBallots).sum().drop(seated).idxmax()
print(pandas.DataFrame(reweightedBallots).sum())
seated.append(winner)
return reweightedBallots
while len(seated) < seats:
nextRound(ballots)
print(seated)
```

Here is the output of the script when executed:

```
Red 18.0
Green 10.0
Yellow 14.0
Blue 18.0
dtype: float64
['Red']
Red 10.000000
Green 9.166667
Yellow 11.500000
Blue 10.833333
dtype: float64
['Red', 'Yellow']
Red 8.881410
Green 8.500000
Yellow 6.903846
Blue 9.256410
dtype: float64
['Red', 'Yellow', 'Blue']
Red 6.684219
Green 7.078755
Yellow 6.121795
Blue 6.947497
dtype: float64
['Red', 'Yellow', 'Blue', 'Green']
```

`'Red'`

, then `'Yellow'`

, then `'Blue'`

, then `'Green'`

). After reordering to cluster similar voters, the ballots may be expressed as ABIF as follows:
```
1: [Red]/5 = [Blue]/5 > [Yellow]/3 > [Green]/0
2: [Red]/5 = [Blue]/4 > [Yellow]/0 = [Green]/0
1: [Yellow]/5 > [Green]/0 = [Blue]/0 = [Red]/0
1: [Yellow]/4 > [Blue]/3 > [Green]/2 > [Red]/1
1: [Yellow]/2 > [Red]/1 > [Green]/0 = [Blue]/0
1: [Green]/5 > [Blue]/1 > [Red]/0 = [Yellow]/0
1: [Green]/3 > [Red]/1 = [Blue]/1 > [Yellow]/0
```

`'Red'`

and `'Blue'`

are tied in the first round, with scores of "`18.0`

". Because of the tie, the software arbitrarily chooses `'Red'`

(though `'Blue'`

may be arbitrarily chosen with the method in a different software implementation). After that, User:RobLa gets lost (as of April 2022), so someone else is going to have to explain how `'Blue'`

falls behind `'Yellow'`

in reweighted ballots of the second round.

## Related systems

If approval ballots are used, this method reduces to sequential proportional approval voting ("SPAV"). An arguably more natural extension of "SPAV" to score ballots is single distributed vote. These systems are very similar.