election-methods@mailman.electorama.com

Technical discussion of election methods

View all threads

Preliminary Droop-fit proportionality results

KM
Kristofer Munsterhjelm
Fri, May 29, 2026 9:45 PM

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.

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.
TP
Toby Pereira
Sat, May 30, 2026 4:07 PM

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.

[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.

Election-Methods mailing list - see https://electorama.com/em for list info

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. [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. ---- Election-Methods mailing list - see https://electorama.com/em for list info
EB
Etjon Basha
Sun, May 31, 2026 9:33 AM

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.

[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.

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. > > [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. > ---- > Election-Methods mailing list - see https://electorama.com/em for list > info >
TP
Toby Pereira
Tue, Jun 2, 2026 2:54 PM

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.

[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.

Election-Methods mailing list - see https://electorama.com/em for list info


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. [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. ---- Election-Methods mailing list - see https://electorama.com/em for list info ---- Election-Methods mailing list - see https://electorama.com/em for list info
KM
Kristofer Munsterhjelm
Tue, Jun 2, 2026 7:33 PM

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 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
TP
Toby Pereira
Tue, Jun 2, 2026 9:11 PM

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

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
KM
Kristofer Munsterhjelm
Tue, Jun 9, 2026 9:30 PM

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? 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
KM
Kristofer Munsterhjelm
Wed, Jun 17, 2026 2:28 PM

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

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
EB
Etjon Basha
Wed, Jun 17, 2026 9:03 PM

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

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 >
TP
Toby Pereira
Wed, Jun 17, 2026 11:20 PM

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

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