So I implemented a quick version of a spatial Droop proportionality measure:
The voters are drawn from a standard normal over a 1D opinion space, and
the candidates are drawn either from the same standard normal or a
uniform distribution (odd iterations use one, even iterations use the
other).[1] Each voter ranks the candidates in distance (and rates them
according to negative distance).
The "ideal" kth candidate is the k/(s+1)th quantile of the (drawn) voter
distribution; the error is then the square root of the sum of squares
between each ideal kth candidate and the kth candidate actually elected
(in order from leftmost to rightmost).
So, for instance, if it's a two-candidate election and the voters'
quantiles are -0.43 and +0.43, and method X elects candidates who are at
-0.27 and +0.34 respectively. Then the error for method X in that
election is the Euclidean distance between (-0.43, 0.43) and (-0.27,
0.34) ~= 0.184.[2]
I then calculated the VSE over this measure with 4096 voters, 10
candidates, and different numbers of seats. Here are some results with
some comments afterwards.
Note that a bad result (low VSE) only gives an indication that the
method doesn't select candidates close to the Droop quantiles, but not
why. It doesn't distinguish between that happening because the method
has a different notion of proportionality, or because it has no such
notion and is all over the place.
(I'd like to implement something that determines what that notion of
proportionality is if there is one. But I should read Ryan's post more
thoroughly before I do that.)
2 seats:
Name VSE
Log-penalty voting -1.47
Random ballots 0.29
Isoelastic (r=1) 0.32
Isoelastic (r=10) 0.37
Schulze STV 0.45
SNTV 0.46
QPQ (0.01) 0.47
Psi voting (delta=0) 0.52
Psi voting (Sainte-Laguë) 0.55
Psi voting (d'Hondt) 0.56
QPQ (Sainte-Laguë) 0.59
Isoelastic (r=2) 0.64
(Bloc) Normalized 0-20 Range 0.65
(Bloc) Borda 0.68
PSC-CLE 0.72
QPQ (d'Hondt) 0.79
Meek/Warren STV 0.80
STV 0.80
STV-ME(Schulze) 0.80
Harmonic voting (delta=0.02) 0.80
Harmonic voting (d'Hondt) 0.87
Harmonic voting (Sainte-Laguë) 0.93
5 seats:
Name VSE
Log-penalty voting -1.36
Isoelastic (r=10) -0.30
Schulze STV 0.21
QPQ (0.01) 0.32
Isoelastic (r=1) 0.36
Psi voting (delta=0) 0.39
Random ballots 0.38
Psi voting (Sainte-Laguë) 0.40
Psi voting (d'Hondt) 0.41
(Bloc) Normalized 0-20 Range 0.44
Isoelastic (r=2) 0.44
(Bloc) Borda 0.49
Harmonic voting (delta=0.02) 0.59
SNTV 0.67
Harmonic voting (d'Hondt) 0.76
PSC-CLE 0.81
QPQ (Sainte-Laguë) 0.83
Harmonic voting (Sainte-Laguë) 0.89
STV 0.94
QPQ (d'Hondt) 0.94
Meek/Warren STV 0.94
STV-ME(Schulze) 0.96
9 seats:
Name VSE
Log-penalty voting -0.70
Schulze STV 0.00
Isoelastic (r=10) 0.10
Isoelastic (r=1) 0.19
Random ballots 0.41
SNTV 0.57
Harmonic voting (delta=0.02) 0.57
QPQ (0.01) 0.57
Isoelastic (r=2) 0.71
(Bloc) Normalized 0-20 Range 0.71
(Bloc) Borda 0.81
Psi voting (d'Hondt) 0.82
Psi voting (Sainte-Laguë) 0.82
Psi voting (delta=0) 0.83
Harmonic voting (d'Hondt) 0.90
QPQ (Sainte-Laguë) 0.91
PSC-CLE 0.92
Harmonic voting (Sainte-Laguë) 0.95
STV 0.98
STV-ME(Schulze) 0.98
QPQ (d'Hondt) 0.998
Meek/Warren STV 0.998
("Random ballots" is the method where one repeatedly picks a random
voter and elects their favorite continuing candidate.)
The most surprising part, to me, is the bad fit of Schulze STV and how
little IRV's problems seem to generalize to STV, at least by this
measure. It's also a bit surprising that for most tunable methods,
d'Hondt does better than Sainte-Laguë, but for Harmonic the opposite is
true.
Harmonic seems to do better than Psi, just as it did in the my earlier
simulations.
In retrospect, it's not that surprising that Harmonic is beaten by
ranked methods because it doesn't optimize the same thing (just like
single-winner Range has a different objective than majority rule).
If I were to guess, I'd imagine that there is some kind of property
that, if passed, leads to good performance here; and STV passes its due
to the way it works, but Schulze STV doesn't because it was designed
primarily to be strategy-resistant. But that's just a guess.
-km
[1] My point with doing this was to penalize methods that just make
assumptions about the voter distribution from the candidate distribution
or vice versa.
[2] Ideally, the error measure should be designed to generalize to
something like the Sainte-Laguë index in the party list case, but I just
chose something easy and broadly reasonable here.
Some interesting results. I'm not really that knowledgeable on how the different STV methods all philosophically differ from each other, but it is interesting how Schulze STV doesn't not perform that brilliantly here. So it seems that QPQ and Meek/Warren are better when it comes to "optimal" PR (for some definition of optimal anyway) rather than strategy-resistance.
I'm not at all surprised that Harmonic voting does better than Psi. I always felt Psi was "wrong" and in need of repair. Harmonic voting does that repair. Thiele-based methods can still go wrong in some cases if you don't have unlimited clones, but I don't think the way your opinion space has been defined would show this - which isn't a criticism by the way.
For a cardinal-based definition of PR, I think it's unlikely you could do much better than Harmonic voting with this sort of simulation. The COWPEA / COWPEA Lottery method doesn't have a known sensible deterministic counterpart, and that's the only other cardinal PR philosophy that I consider to be robustly good (in a theoretical, as opposed to practical, way). One way to test the two philosophies against each other would be to use the lottery form of both in a simulation with many elected candidates and compare the differences.
Toby
On Saturday, 30 May 2026 at 16:32:05 BST, Kristofer Munsterhjelm via Election-Methods election-methods@lists.electorama.com wrote:
So I implemented a quick version of a spatial Droop proportionality measure:
The voters are drawn from a standard normal over a 1D opinion space, and
the candidates are drawn either from the same standard normal or a
uniform distribution (odd iterations use one, even iterations use the
other).[1] Each voter ranks the candidates in distance (and rates them
according to negative distance).
The "ideal" kth candidate is the k/(s+1)th quantile of the (drawn) voter
distribution; the error is then the square root of the sum of squares
between each ideal kth candidate and the kth candidate actually elected
(in order from leftmost to rightmost).
So, for instance, if it's a two-candidate election and the voters'
quantiles are -0.43 and +0.43, and method X elects candidates who are at
-0.27 and +0.34 respectively. Then the error for method X in that
election is the Euclidean distance between (-0.43, 0.43) and (-0.27,
0.34) ~= 0.184.[2]
I then calculated the VSE over this measure with 4096 voters, 10
candidates, and different numbers of seats. Here are some results with
some comments afterwards.
Note that a bad result (low VSE) only gives an indication that the
method doesn't select candidates close to the Droop quantiles, but not
why. It doesn't distinguish between that happening because the method
has a different notion of proportionality, or because it has no such
notion and is all over the place.
(I'd like to implement something that determines what that notion of
proportionality is if there is one. But I should read Ryan's post more
thoroughly before I do that.)
2 seats:
Name VSE
Log-penalty voting -1.47
Random ballots 0.29
Isoelastic (r=1) 0.32
Isoelastic (r=10) 0.37
Schulze STV 0.45
SNTV 0.46
QPQ (0.01) 0.47
Psi voting (delta=0) 0.52
Psi voting (Sainte-Laguë) 0.55
Psi voting (d'Hondt) 0.56
QPQ (Sainte-Laguë) 0.59
Isoelastic (r=2) 0.64
(Bloc) Normalized 0-20 Range 0.65
(Bloc) Borda 0.68
PSC-CLE 0.72
QPQ (d'Hondt) 0.79
Meek/Warren STV 0.80
STV 0.80
STV-ME(Schulze) 0.80
Harmonic voting (delta=0.02) 0.80
Harmonic voting (d'Hondt) 0.87
Harmonic voting (Sainte-Laguë) 0.93
5 seats:
Name VSE
Log-penalty voting -1.36
Isoelastic (r=10) -0.30
Schulze STV 0.21
QPQ (0.01) 0.32
Isoelastic (r=1) 0.36
Psi voting (delta=0) 0.39
Random ballots 0.38
Psi voting (Sainte-Laguë) 0.40
Psi voting (d'Hondt) 0.41
(Bloc) Normalized 0-20 Range 0.44
Isoelastic (r=2) 0.44
(Bloc) Borda 0.49
Harmonic voting (delta=0.02) 0.59
SNTV 0.67
Harmonic voting (d'Hondt) 0.76
PSC-CLE 0.81
QPQ (Sainte-Laguë) 0.83
Harmonic voting (Sainte-Laguë) 0.89
STV 0.94
QPQ (d'Hondt) 0.94
Meek/Warren STV 0.94
STV-ME(Schulze) 0.96
9 seats:
Name VSE
Log-penalty voting -0.70
Schulze STV 0.00
Isoelastic (r=10) 0.10
Isoelastic (r=1) 0.19
Random ballots 0.41
SNTV 0.57
Harmonic voting (delta=0.02) 0.57
QPQ (0.01) 0.57
Isoelastic (r=2) 0.71
(Bloc) Normalized 0-20 Range 0.71
(Bloc) Borda 0.81
Psi voting (d'Hondt) 0.82
Psi voting (Sainte-Laguë) 0.82
Psi voting (delta=0) 0.83
Harmonic voting (d'Hondt) 0.90
QPQ (Sainte-Laguë) 0.91
PSC-CLE 0.92
Harmonic voting (Sainte-Laguë) 0.95
STV 0.98
STV-ME(Schulze) 0.98
QPQ (d'Hondt) 0.998
Meek/Warren STV 0.998
("Random ballots" is the method where one repeatedly picks a random
voter and elects their favorite continuing candidate.)
The most surprising part, to me, is the bad fit of Schulze STV and how
little IRV's problems seem to generalize to STV, at least by this
measure. It's also a bit surprising that for most tunable methods,
d'Hondt does better than Sainte-Laguë, but for Harmonic the opposite is
true.
Harmonic seems to do better than Psi, just as it did in the my earlier
simulations.
In retrospect, it's not that surprising that Harmonic is beaten by
ranked methods because it doesn't optimize the same thing (just like
single-winner Range has a different objective than majority rule).
If I were to guess, I'd imagine that there is some kind of property
that, if passed, leads to good performance here; and STV passes its due
to the way it works, but Schulze STV doesn't because it was designed
primarily to be strategy-resistant. But that's just a guess.
-km
[1] My point with doing this was to penalize methods that just make
assumptions about the voter distribution from the candidate distribution
or vice versa.
Election-Methods mailing list - see https://electorama.com/em for list info
Thank you for sharing these Kristofer,
Always a pleasure to see one's biases reinforced by independent sources,
with such a total Warren/Meek STV victory over Schultze. If only Warren had
outdone Meek, this would have been perfect.
Best regards,
Etjon
The only thing th
On Sun, 31 May 2026, 1:31 am Kristofer Munsterhjelm via Election-Methods, <
election-methods@lists.electorama.com> wrote:
So I implemented a quick version of a spatial Droop proportionality
measure:
The voters are drawn from a standard normal over a 1D opinion space, and
the candidates are drawn either from the same standard normal or a
uniform distribution (odd iterations use one, even iterations use the
other).[1] Each voter ranks the candidates in distance (and rates them
according to negative distance).
The "ideal" kth candidate is the k/(s+1)th quantile of the (drawn) voter
distribution; the error is then the square root of the sum of squares
between each ideal kth candidate and the kth candidate actually elected
(in order from leftmost to rightmost).
So, for instance, if it's a two-candidate election and the voters'
quantiles are -0.43 and +0.43, and method X elects candidates who are at
-0.27 and +0.34 respectively. Then the error for method X in that
election is the Euclidean distance between (-0.43, 0.43) and (-0.27,
0.34) ~= 0.184.[2]
I then calculated the VSE over this measure with 4096 voters, 10
candidates, and different numbers of seats. Here are some results with
some comments afterwards.
Note that a bad result (low VSE) only gives an indication that the
method doesn't select candidates close to the Droop quantiles, but not
why. It doesn't distinguish between that happening because the method
has a different notion of proportionality, or because it has no such
notion and is all over the place.
(I'd like to implement something that determines what that notion of
proportionality is if there is one. But I should read Ryan's post more
thoroughly before I do that.)
2 seats:
Name VSE
Log-penalty voting -1.47
Random ballots 0.29
Isoelastic (r=1) 0.32
Isoelastic (r=10) 0.37
Schulze STV 0.45
SNTV 0.46
QPQ (0.01) 0.47
Psi voting (delta=0) 0.52
Psi voting (Sainte-Laguë) 0.55
Psi voting (d'Hondt) 0.56
QPQ (Sainte-Laguë) 0.59
Isoelastic (r=2) 0.64
(Bloc) Normalized 0-20 Range 0.65
(Bloc) Borda 0.68
PSC-CLE 0.72
QPQ (d'Hondt) 0.79
Meek/Warren STV 0.80
STV 0.80
STV-ME(Schulze) 0.80
Harmonic voting (delta=0.02) 0.80
Harmonic voting (d'Hondt) 0.87
Harmonic voting (Sainte-Laguë) 0.93
5 seats:
Name VSE
Log-penalty voting -1.36
Isoelastic (r=10) -0.30
Schulze STV 0.21
QPQ (0.01) 0.32
Isoelastic (r=1) 0.36
Psi voting (delta=0) 0.39
Random ballots 0.38
Psi voting (Sainte-Laguë) 0.40
Psi voting (d'Hondt) 0.41
(Bloc) Normalized 0-20 Range 0.44
Isoelastic (r=2) 0.44
(Bloc) Borda 0.49
Harmonic voting (delta=0.02) 0.59
SNTV 0.67
Harmonic voting (d'Hondt) 0.76
PSC-CLE 0.81
QPQ (Sainte-Laguë) 0.83
Harmonic voting (Sainte-Laguë) 0.89
STV 0.94
QPQ (d'Hondt) 0.94
Meek/Warren STV 0.94
STV-ME(Schulze) 0.96
9 seats:
Name VSE
Log-penalty voting -0.70
Schulze STV 0.00
Isoelastic (r=10) 0.10
Isoelastic (r=1) 0.19
Random ballots 0.41
SNTV 0.57
Harmonic voting (delta=0.02) 0.57
QPQ (0.01) 0.57
Isoelastic (r=2) 0.71
(Bloc) Normalized 0-20 Range 0.71
(Bloc) Borda 0.81
Psi voting (d'Hondt) 0.82
Psi voting (Sainte-Laguë) 0.82
Psi voting (delta=0) 0.83
Harmonic voting (d'Hondt) 0.90
QPQ (Sainte-Laguë) 0.91
PSC-CLE 0.92
Harmonic voting (Sainte-Laguë) 0.95
STV 0.98
STV-ME(Schulze) 0.98
QPQ (d'Hondt) 0.998
Meek/Warren STV 0.998
("Random ballots" is the method where one repeatedly picks a random
voter and elects their favorite continuing candidate.)
The most surprising part, to me, is the bad fit of Schulze STV and how
little IRV's problems seem to generalize to STV, at least by this
measure. It's also a bit surprising that for most tunable methods,
d'Hondt does better than Sainte-Laguë, but for Harmonic the opposite is
true.
Harmonic seems to do better than Psi, just as it did in the my earlier
simulations.
In retrospect, it's not that surprising that Harmonic is beaten by
ranked methods because it doesn't optimize the same thing (just like
single-winner Range has a different objective than majority rule).
If I were to guess, I'd imagine that there is some kind of property
that, if passed, leads to good performance here; and STV passes its due
to the way it works, but Schulze STV doesn't because it was designed
primarily to be strategy-resistant. But that's just a guess.
-km
[1] My point with doing this was to penalize methods that just make
assumptions about the voter distribution from the candidate distribution
or vice versa.
Election-Methods mailing list - see https://electorama.com/em for list
info
Interestingly Kristofer put the two methods together suggesting the simulation ran them as if they were they same method. I don't really know the difference between all the STV methods, but QPQ also got a score 0f 0.998 for 9 seats, suggesting it's up there as well. Do we know why Schulze outperformed the others for 5 seats but not 9?
Toby
On Sunday, 31 May 2026 at 10:34:43 BST, Etjon Basha via Election-Methods election-methods@lists.electorama.com wrote:
Thank you for sharing these Kristofer,
Always a pleasure to see one's biases reinforced by independent sources, with such a total Warren/Meek STV victory over Schultze. If only Warren had outdone Meek, this would have been perfect.
Best regards,
Etjon
The only thing th
On Sun, 31 May 2026, 1:31 am Kristofer Munsterhjelm via Election-Methods, election-methods@lists.electorama.com wrote:
So I implemented a quick version of a spatial Droop proportionality measure:
The voters are drawn from a standard normal over a 1D opinion space, and
the candidates are drawn either from the same standard normal or a
uniform distribution (odd iterations use one, even iterations use the
other).[1] Each voter ranks the candidates in distance (and rates them
according to negative distance).
The "ideal" kth candidate is the k/(s+1)th quantile of the (drawn) voter
distribution; the error is then the square root of the sum of squares
between each ideal kth candidate and the kth candidate actually elected
(in order from leftmost to rightmost).
So, for instance, if it's a two-candidate election and the voters'
quantiles are -0.43 and +0.43, and method X elects candidates who are at
-0.27 and +0.34 respectively. Then the error for method X in that
election is the Euclidean distance between (-0.43, 0.43) and (-0.27,
0.34) ~= 0.184.[2]
I then calculated the VSE over this measure with 4096 voters, 10
candidates, and different numbers of seats. Here are some results with
some comments afterwards.
Note that a bad result (low VSE) only gives an indication that the
method doesn't select candidates close to the Droop quantiles, but not
why. It doesn't distinguish between that happening because the method
has a different notion of proportionality, or because it has no such
notion and is all over the place.
(I'd like to implement something that determines what that notion of
proportionality is if there is one. But I should read Ryan's post more
thoroughly before I do that.)
2 seats:
Name VSE
Log-penalty voting -1.47
Random ballots 0.29
Isoelastic (r=1) 0.32
Isoelastic (r=10) 0.37
Schulze STV 0.45
SNTV 0.46
QPQ (0.01) 0.47
Psi voting (delta=0) 0.52
Psi voting (Sainte-Laguë) 0.55
Psi voting (d'Hondt) 0.56
QPQ (Sainte-Laguë) 0.59
Isoelastic (r=2) 0.64
(Bloc) Normalized 0-20 Range 0.65
(Bloc) Borda 0.68
PSC-CLE 0.72
QPQ (d'Hondt) 0.79
Meek/Warren STV 0.80
STV 0.80
STV-ME(Schulze) 0.80
Harmonic voting (delta=0.02) 0.80
Harmonic voting (d'Hondt) 0.87
Harmonic voting (Sainte-Laguë) 0.93
5 seats:
Name VSE
Log-penalty voting -1.36
Isoelastic (r=10) -0.30
Schulze STV 0.21
QPQ (0.01) 0.32
Isoelastic (r=1) 0.36
Psi voting (delta=0) 0.39
Random ballots 0.38
Psi voting (Sainte-Laguë) 0.40
Psi voting (d'Hondt) 0.41
(Bloc) Normalized 0-20 Range 0.44
Isoelastic (r=2) 0.44
(Bloc) Borda 0.49
Harmonic voting (delta=0.02) 0.59
SNTV 0.67
Harmonic voting (d'Hondt) 0.76
PSC-CLE 0.81
QPQ (Sainte-Laguë) 0.83
Harmonic voting (Sainte-Laguë) 0.89
STV 0.94
QPQ (d'Hondt) 0.94
Meek/Warren STV 0.94
STV-ME(Schulze) 0.96
9 seats:
Name VSE
Log-penalty voting -0.70
Schulze STV 0.00
Isoelastic (r=10) 0.10
Isoelastic (r=1) 0.19
Random ballots 0.41
SNTV 0.57
Harmonic voting (delta=0.02) 0.57
QPQ (0.01) 0.57
Isoelastic (r=2) 0.71
(Bloc) Normalized 0-20 Range 0.71
(Bloc) Borda 0.81
Psi voting (d'Hondt) 0.82
Psi voting (Sainte-Laguë) 0.82
Psi voting (delta=0) 0.83
Harmonic voting (d'Hondt) 0.90
QPQ (Sainte-Laguë) 0.91
PSC-CLE 0.92
Harmonic voting (Sainte-Laguë) 0.95
STV 0.98
STV-ME(Schulze) 0.98
QPQ (d'Hondt) 0.998
Meek/Warren STV 0.998
("Random ballots" is the method where one repeatedly picks a random
voter and elects their favorite continuing candidate.)
The most surprising part, to me, is the bad fit of Schulze STV and how
little IRV's problems seem to generalize to STV, at least by this
measure. It's also a bit surprising that for most tunable methods,
d'Hondt does better than Sainte-Laguë, but for Harmonic the opposite is
true.
Harmonic seems to do better than Psi, just as it did in the my earlier
simulations.
In retrospect, it's not that surprising that Harmonic is beaten by
ranked methods because it doesn't optimize the same thing (just like
single-winner Range has a different objective than majority rule).
If I were to guess, I'd imagine that there is some kind of property
that, if passed, leads to good performance here; and STV passes its due
to the way it works, but Schulze STV doesn't because it was designed
primarily to be strategy-resistant. But that's just a guess.
-km
[1] My point with doing this was to penalize methods that just make
assumptions about the voter distribution from the candidate distribution
or vice versa.
Election-Methods mailing list - see https://electorama.com/em for list info
Election-Methods mailing list - see https://electorama.com/em for list info
On 2026-06-02 16:54, Toby Pereira wrote:
Interestingly Kristofer put the two methods together suggesting the
simulation ran them as if they were they same method. I don't really
know the difference between all the STV methods, but QPQ also got a
score 0f 0.998 for 9 seats, suggesting it's up there as well. Do we know
why Schulze outperformed the others for 5 seats but not 9?
I put Meek and Warren together because their errors and VSE values were
identical for every run, even though I implemented them as distinct
methods. They seem to be very close in practice.
As for Schulze on the five-seater, STV-ME is a different method than
Schulze STV. STV-ME is the following generalization of BTR-IRV:
Do STV k-seat STV, but when a candidate needs to be eliminated, do an
"unlucky loser" election containing the k+1 candidates with the fewest
first preference votes, using the base method in question. (The
remaining candidates are eliminated from the unlucky loser election
before it is run.) Then eliminate the loser of that election, i.e. the
candidate ranked last by the base method.
So STV-ME(Schulze) is not Schulze STV, it's this BTR-IRV generalization
with Schulze as the method used to call the loser. In the single-winner
case, with a base method that passes the majority criterion, STV-ME
reduces to BTR-IRV.
For 5 seats, we have
Schulze STV 0.21
STV 0.94
QPQ (d'Hondt) 0.94
Meek/Warren STV 0.94
STV-ME(Schulze) 0.96
Schulze STV proper is still not all that great.
I guess STV-ME does better because its loser selection is less
susceptible to center squeeze-like problems; but that doesn't explain
why its less clearly an improvement with two seats than with five; if
the elimination process is the problem, then you'd expect that it would
beat STV more decisively the fewer seats you have.
In a naive combinatorial sense, 5-of-10 is the toughest because the
number of possible outcomes is maximized. But I don't know if that holds
for the proportionality problem as such.
-km
I see yes, thanks. In that case, Schulze STV seems to do pretty terribly, not just a bit worse than other STV methods. And looking at your whole list, considerably worse than things like (Bloc) Borda! It's definitely not broken in your simulation?
Toby
On Tuesday, 2 June 2026 at 20:33:08 BST, Kristofer Munsterhjelm km-elmet@munsterhjelm.no wrote:
On 2026-06-02 16:54, Toby Pereira wrote:
Interestingly Kristofer put the two methods together suggesting the
simulation ran them as if they were they same method. I don't really
know the difference between all the STV methods, but QPQ also got a
score 0f 0.998 for 9 seats, suggesting it's up there as well. Do we know
why Schulze outperformed the others for 5 seats but not 9?
I put Meek and Warren together because their errors and VSE values were
identical for every run, even though I implemented them as distinct
methods. They seem to be very close in practice.
As for Schulze on the five-seater, STV-ME is a different method than
Schulze STV. STV-ME is the following generalization of BTR-IRV:
Do STV k-seat STV, but when a candidate needs to be eliminated, do an
"unlucky loser" election containing the k+1 candidates with the fewest
first preference votes, using the base method in question. (The
remaining candidates are eliminated from the unlucky loser election
before it is run.) Then eliminate the loser of that election, i.e. the
candidate ranked last by the base method.
So STV-ME(Schulze) is not Schulze STV, it's this BTR-IRV generalization
with Schulze as the method used to call the loser. In the single-winner
case, with a base method that passes the majority criterion, STV-ME
reduces to BTR-IRV.
For 5 seats, we have
Schulze STV 0.21
STV 0.94
QPQ (d'Hondt) 0.94
Meek/Warren STV 0.94
STV-ME(Schulze) 0.96
Schulze STV proper is still not all that great.
I guess STV-ME does better because its loser selection is less
susceptible to center squeeze-like problems; but that doesn't explain
why its less clearly an improvement with two seats than with five; if
the elimination process is the problem, then you'd expect that it would
beat STV more decisively the fewer seats you have.
In a naive combinatorial sense, 5-of-10 is the toughest because the
number of possible outcomes is maximized. But I don't know if that holds
for the proportionality problem as such.
-km
On 2026-06-02 23:11, Toby Pereira wrote:
I see yes, thanks. In that case, Schulze STV seems to do pretty
terribly, not just a bit worse than other STV methods. And looking at
your whole list, considerably worse than things like (Bloc) Borda! It's
definitely not broken in your simulation?
It's hard to tell because the method is so complex; I don't have any
other implementations than Schulze's own and my interface with my own
code. At least Schulze provides some example elections in his papers, so
I could code up those and check if I get the right results.
More broadly, it would be nice to have test vectors for a number of
methods, particularly exercising their edge cases... but gathering a
comprehensive library of them would be a significant undertaking in
itself, I think.
I agree that Schulze STV seems unreasonably bad here, but the really
strange part is that they're not "obviously broken" bad. For instance, I
extended my simulator to find the level of proportionality that best fit
the method (in the sense of giving the best VSE assuming this level of
proportionality) for two-seat elections. For STV and Schulze STV, I got
the following results with two seats, ten candidates:
Name Prop. quantile Goodness-of-fit VSE
STV 0.3404 0.7946
Meek/Warren 0.3397 0.7945
Schulze STV 0.393 0.5141
while obviously ill-fitting methods have more extreme values:
Name Prop. quantile Goodness-of-fit VSE
LPV0+ 0.0004 -0.4447
Bloc Borda 0.5 0.9331
Plurality loser 0 -0.1641
Here, exact Droop proportionality corresponds to a quantile value of
1/3; lower than this is more factional, higher is more majoritarian.
"Plurality loser" elects the candidates with the fewest first preferences.
I'll give more results in another post, but for Schulze STV in
particular, its best-fit proportionality level doesn't seem too far off
Droop, and it seems strange that it should be that close by chance.
Further adding to the weirdness is that when I wrote a coalitional
manipulability simulator for n-1-seat n-candidate elections, Schulze STV
had a very low manipulability value - which is what you'd expect for a
method explicitly designed to be resistant to strategy, and not what a
broken version of it would produce.
So maybe it is broken in some complex way or my proportionality
simulator in particular is exposing some bug that the other simulators
don't. I should implement the test elections and see what I get, and
until then just say "something might be wrong, but if so, whatever is
causing the error is subtle, not obvious".
-km
On 2026-06-02 23:11, Toby Pereira wrote:
I see yes, thanks. In that case, Schulze STV seems to do pretty
terribly, not just a bit worse than other STV methods. And looking at
your whole list, considerably worse than things like (Bloc) Borda! It's
definitely not broken in your simulation?
I added some tests to Schulze STV and found an election where quadelect
would return the wrong outcome.
The bug appears to have been caused by undefined behavior in Schulze's
own code, where a line does something that has no clear order of
execution, and different compilers resolve the ambiguity differently. I
tested Schulze's prog01 compiled with a modern gcc and got the same bug.
After fixing the bug, I tested the example elections referenced in
"Implementing the Schulze STV Method"[1], table 2, and the Schulze STV
code used by my simulator now gives the correct outcome - i.e. the ones
listed in the paper - for all of them.
I then ran my multiwinner simulations and got much better results.
Sorry, Etjon :-)
Droop spatial proportionality:
Two seats, 10 candidates, 14400 elections:
Name Droop goodness-of-fit VSE
Meek/Warren 0.7932
Harmonic (S-L) 0.9254
Schulze STV 0.9997
Three seats:
Warren 0.8712
Meek 0.8713
Harmonic (S-L) 0.8925
Schulze STV 0.9992
Four seats:
Harmonic (S-L) 0.8880
Warren 0.9184
Meek 0.9185
Schulze STV 0.9954
Five seats:
Harmonic (S-L) 0.8809
Warren 0.9426
Meek 0.9428
Schulze STV 0.9874
Six seats:
Harmonic (S-L) 0.8779
Meek 0.9598
Warren 0.9598
Schulze STV 0.9758
Nine seats:
Harmonic (S-L) 0.9450
Schulze STV 0.9497
Meek 0.9979
Warren 0.9980
The quantile fits for two out of ten are (288k elections):
Name Prop. quantile Goodness-of-fit VSE
Schulze STV 0.3377 0.9961
Harmonic (S-L) 0.3498 0.9223
Meek/Warren 0.3344 0.8090
and for the 2-of-4 CFC-Kemeny comparison (5760 elections):
Name Prop. quantile Goodness-of-fit VSE
Harmonic (S-L) 0.3317 0.9414
Meek/Warren 0.3321 0.9602
Schulze STV 0.3345 0.9989
CFC-Kemeny 0.2493 0.9998
as well as 2-of-5 (7200 elections):
Name Prop. quantile Goodness-of-fit VSE
Meek/Warren 0.3346 0.9208
Harmonic (S-L) 0.3383 0.9294
CFC-Kemeny 0.2441 0.9967
Schulze STV 0.3371 0.9967
So Schulze STV seems to be pretty good, but its margin over other
methods shrinks as seats/candidates ratio increases, to the point where
Meek and Warren beats it with nine seats.
Perhaps this has something to do with how Schulze STV's main calculation
is on sets that differ by one candidate, that it then uses widest path
to extrapolate; if there are more winners, such paths may have more
steps. But I don't know for sure.
I also found a few crash-inducing memory access bugs in Schulze's
implementation, but the code is difficult enough to understand that I'm
unsure how to fix them. I'll probably give more details in another post.
-km
[1]
https://sites.math.duke.edu/~bray/Courses/49s/Additional%20Reading/Schulze/Schulze3/schulze3.pdf
Boo!
On Thu, 18 June 2026, 12:28 am Kristofer Munsterhjelm, <
km-elmet@munsterhjelm.no> wrote:
On 2026-06-02 23:11, Toby Pereira wrote:
I see yes, thanks. In that case, Schulze STV seems to do pretty
terribly, not just a bit worse than other STV methods. And looking at
your whole list, considerably worse than things like (Bloc) Borda! It's
definitely not broken in your simulation?
I added some tests to Schulze STV and found an election where quadelect
would return the wrong outcome.
The bug appears to have been caused by undefined behavior in Schulze's
own code, where a line does something that has no clear order of
execution, and different compilers resolve the ambiguity differently. I
tested Schulze's prog01 compiled with a modern gcc and got the same bug.
After fixing the bug, I tested the example elections referenced in
"Implementing the Schulze STV Method"[1], table 2, and the Schulze STV
code used by my simulator now gives the correct outcome - i.e. the ones
listed in the paper - for all of them.
I then ran my multiwinner simulations and got much better results.
Sorry, Etjon :-)
Droop spatial proportionality:
Two seats, 10 candidates, 14400 elections:
Name Droop goodness-of-fit VSE
Meek/Warren 0.7932
Harmonic (S-L) 0.9254
Schulze STV 0.9997
Three seats:
Warren 0.8712
Meek 0.8713
Harmonic (S-L) 0.8925
Schulze STV 0.9992
Four seats:
Harmonic (S-L) 0.8880
Warren 0.9184
Meek 0.9185
Schulze STV 0.9954
Five seats:
Harmonic (S-L) 0.8809
Warren 0.9426
Meek 0.9428
Schulze STV 0.9874
Six seats:
Harmonic (S-L) 0.8779
Meek 0.9598
Warren 0.9598
Schulze STV 0.9758
Nine seats:
Harmonic (S-L) 0.9450
Schulze STV 0.9497
Meek 0.9979
Warren 0.9980
The quantile fits for two out of ten are (288k elections):
Name Prop. quantile Goodness-of-fit VSE
Schulze STV 0.3377 0.9961
Harmonic (S-L) 0.3498 0.9223
Meek/Warren 0.3344 0.8090
and for the 2-of-4 CFC-Kemeny comparison (5760 elections):
Name Prop. quantile Goodness-of-fit VSE
Harmonic (S-L) 0.3317 0.9414
Meek/Warren 0.3321 0.9602
Schulze STV 0.3345 0.9989
CFC-Kemeny 0.2493 0.9998
as well as 2-of-5 (7200 elections):
Name Prop. quantile Goodness-of-fit VSE
Meek/Warren 0.3346 0.9208
Harmonic (S-L) 0.3383 0.9294
CFC-Kemeny 0.2441 0.9967
Schulze STV 0.3371 0.9967
So Schulze STV seems to be pretty good, but its margin over other
methods shrinks as seats/candidates ratio increases, to the point where
Meek and Warren beats it with nine seats.
Perhaps this has something to do with how Schulze STV's main calculation
is on sets that differ by one candidate, that it then uses widest path
to extrapolate; if there are more winners, such paths may have more
steps. But I don't know for sure.
I also found a few crash-inducing memory access bugs in Schulze's
implementation, but the code is difficult enough to understand that I'm
unsure how to fix them. I'll probably give more details in another post.
-km
[1]
https://sites.math.duke.edu/~bray/Courses/49s/Additional%20Reading/Schulze/Schulze3/schulze3.pdf
Thanks to Kristofer for doing this extra work to sort out the error and apologies to Etjon for the result it caused!
Toby
On Wednesday, 17 June 2026 at 22:03:13 BST, Etjon Basha etjonbasha@gmail.com wrote:
Boo!
On Thu, 18 June 2026, 12:28 am Kristofer Munsterhjelm, km-elmet@munsterhjelm.no wrote:
On 2026-06-02 23:11, Toby Pereira wrote:
I see yes, thanks. In that case, Schulze STV seems to do pretty
terribly, not just a bit worse than other STV methods. And looking at
your whole list, considerably worse than things like (Bloc) Borda! It's
definitely not broken in your simulation?
I added some tests to Schulze STV and found an election where quadelect
would return the wrong outcome.
The bug appears to have been caused by undefined behavior in Schulze's
own code, where a line does something that has no clear order of
execution, and different compilers resolve the ambiguity differently. I
tested Schulze's prog01 compiled with a modern gcc and got the same bug.
After fixing the bug, I tested the example elections referenced in
"Implementing the Schulze STV Method"[1], table 2, and the Schulze STV
code used by my simulator now gives the correct outcome - i.e. the ones
listed in the paper - for all of them.
I then ran my multiwinner simulations and got much better results.
Sorry, Etjon :-)
Droop spatial proportionality:
Two seats, 10 candidates, 14400 elections:
Name Droop goodness-of-fit VSE
Meek/Warren 0.7932
Harmonic (S-L) 0.9254
Schulze STV 0.9997
Three seats:
Warren 0.8712
Meek 0.8713
Harmonic (S-L) 0.8925
Schulze STV 0.9992
Four seats:
Harmonic (S-L) 0.8880
Warren 0.9184
Meek 0.9185
Schulze STV 0.9954
Five seats:
Harmonic (S-L) 0.8809
Warren 0.9426
Meek 0.9428
Schulze STV 0.9874
Six seats:
Harmonic (S-L) 0.8779
Meek 0.9598
Warren 0.9598
Schulze STV 0.9758
Nine seats:
Harmonic (S-L) 0.9450
Schulze STV 0.9497
Meek 0.9979
Warren 0.9980
The quantile fits for two out of ten are (288k elections):
Name Prop. quantile Goodness-of-fit VSE
Schulze STV 0.3377 0.9961
Harmonic (S-L) 0.3498 0.9223
Meek/Warren 0.3344 0.8090
and for the 2-of-4 CFC-Kemeny comparison (5760 elections):
Name Prop. quantile Goodness-of-fit VSE
Harmonic (S-L) 0.3317 0.9414
Meek/Warren 0.3321 0.9602
Schulze STV 0.3345 0.9989
CFC-Kemeny 0.2493 0.9998
as well as 2-of-5 (7200 elections):
Name Prop. quantile Goodness-of-fit VSE
Meek/Warren 0.3346 0.9208
Harmonic (S-L) 0.3383 0.9294
CFC-Kemeny 0.2441 0.9967
Schulze STV 0.3371 0.9967
So Schulze STV seems to be pretty good, but its margin over other
methods shrinks as seats/candidates ratio increases, to the point where
Meek and Warren beats it with nine seats.
Perhaps this has something to do with how Schulze STV's main calculation
is on sets that differ by one candidate, that it then uses widest path
to extrapolate; if there are more winners, such paths may have more
steps. But I don't know for sure.
I also found a few crash-inducing memory access bugs in Schulze's
implementation, but the code is difficult enough to understand that I'm
unsure how to fix them. I'll probably give more details in another post.
-km
[1]
https://sites.math.duke.edu/~bray/Courses/49s/Additional%20Reading/Schulze/Schulze3/schulze3.pdf