I actually described this method originally on the CES Google Group, but I think it’s good enough to be worth bringing across to here. It uses approval ballots, but can easily be converted to a score method using the KP Transformation (and I’m sure there are other ways). https://www.reddit.com/r/EndFPTP/comments/6xnc2i/visualization_of_the_kotzepereira_transform_which/
For a slate of candidates, the score for that slate is the probability that each of the candidates will be consecutively elected using the following algorithm, without any failures to elect:
- Clear all notes and eliminate from the ballots all candidates not in the slate and all already-elected candidates.
- Pick a ballot at random.
- If no remaining candidate is named on this ballot, then this is a failure to elect.
- If exactly one candidate is named on this ballot, elect this candidate and goto 1.
- If more than one candidate is named on this ballot, note these candidates and pick another ballot at random.
- If exactly one noted candidate appears on this ballot elect this candidate and goto 1.
- If no previously noted candidate appears on this ballot, ignore this ballot, pick another ballot at random and goto 6.
- If more than one previously noted appears on this ballot, then strike from the notes any candidate not appearing on this ballot and pick another ballot at random and goto 6.
I hope I’ve not made an error in that and it’s clear, but basically you keep picking ballots at random until only one candidate has appeared on them all. If the candidates go from >1 to 0 in one ballot you just ignore that ballot. The first ballot is never ignored though. If no candidates in the slate are on the first ballot, then it’s a failure. The score for a slate of candidates is the probability of electing them all without any failures.
Also, if there are candidates that have been approved on exactly the same ballots as each other, the algorithm will never be able to distinguish between them. In this case, one can be picked at random.
If all voters voted along party lines, then this would be equivalent to D’Hondt party list voting. I won’t give the proof here, but as an example:
2 to elect
2 voters: Party A
1 voter: Party B
D’Hondt would give a tie between AA and AB. This method would do the same.
The score for AA would be (2/3)^2 = 4/9.
The score for AB would be (2/3) * (1/3) + (1/3) * (2/3) = 4/9.
It also trivially passes strong PR, where if there are any universally approved candidates, then they won’t affect the proportionality among the remaining candidate factions.
3 to elect
2 voters: U, A1, A2
1 voter: U, B
The score for U, A1, A2 would be 1 * (2/3)^2 = 4/9.
The score for U A1, B would be 1 * (2/3) * (1/3) + 1 * (1/3) * (2/3) = 4/9.
This is the same as for the first example except with a universally approved candidate added, and the scores remain the same. Adding universally approved candidates to existing slates would not affect the scores of the slates, so strong PR is passed.
However, it does not pass independence of all-approved ballots. Ballots that approve every candidate can affect the results. For example:
2 to elect
2 voters: A1, A2
1 voter: B
1 voter: A1, A2, B
This is the same as the first example apart from the one voter who approves every candidate.
The score for A1, A2 is (3/4)^2 = 9/16 = 0.5625.
The score for A1, B is (2/3) * (2/4) + (1/3) * (3/4) = 7/12 = 0.58333…
There is a bias towards the lesser approved candidate in this case.
It is this failure that caused me to sit on this method for quite a while before reposting it on here as I was on the hunt for the “Holy Grail”, but I am no longer convinced that we can have all the desired criteria in one method.
If you’re not bothered about discretely electing individual candidates, you can elect them with different weights, proportional to the probability of them being picked by the following algorithm:
Pick a ballot at random and note the candidates approved on this ballot. Pick another ballot at random, and strike off from the list all candidates not also approved on this ballot. Continue until one candidate is left. If the number of candidates goes from >1 to 0 in one go, ignore that ballot and continue. If any tie cannot be broken, then elect the remaining candidates with equal probability.
Obviously this is no way to run a real election, but I do think it gives a very nice form of proportionality. It’s what the above method was based on, but electing individual candidates to a set number of positions using this philosophy proved harder than I’d hoped.
It is also very similar to random ballot tie-breaking as mentioned here: https://rangevoting.org/TieBreakIdeas.html
Interestingly you can achieve strong PR and independence of all-approved ballots by having this as a non-deterministic method. Instead of using probabilities, you just elect candidates as they come out of the algorithm.
But to get their proportional share, a party would have to field a full slate of candidates. For example, in an election of two candidates, if a party had half the support but only fielded one candidate, they would only be elected 3/4 of the time.
Although I haven’t proved it yet, I think this has the benefit over other methods passing strong PR of being strictly monotonic - adding an approval for a candidate will increase the score for all the slates containing that candidate while leaving other slates unchanged.
Other methods like Monroe, Phragmen, Ebert and I think PAMSAC do not pass this, although with Monroe and PAMSAC approvals should at least not count against candidates receiving those approvals.
Thiele (also known as proportional approval voting) passes independence of all-approved ballots and is also strictly monotonic, but it fails strong PR.