[EM] Even more complex Sainte-Lague: method description and why
Kristofer Munsterhjelm
km_elmet at t-online.de
Tue Aug 20 14:53:03 PDT 2013
So, discovering the compromising incentive in ordinary Sainte-Lague, I
thought that if one's looking for real deluxe methods, ordinary CPO-SL
might not be enough. In the example above, CPO-SL wouldn't make a
difference since every party gets a seat. Thus I looked about in my
mind, trying to think of a more thoroughly Condorcet generalization of
Sainte-Lague, and I think I have found an ordinary multiwinner
generalization of Sainte-Lague. That is, the method deals with
individual candidates, not parties. One could in theory use it for
party list, but doing that in a brute-force manner by simply replacing
party preferences by the party's slate would be unfeasible when the
number of seats grow to the kind of numbers you would see for a
national count.
Thus I'd have to work further to find out how to make it feasible for
party list. But since it might be of interest as a candidate-based
method, I'll describe it here, even if it still has a few problems.
The framework is simple enough. It's a set comparison method like
CPO-STV and Schulze STV: you have a large matrix where the different
possible councils are "candidates", each contest between two possible
councils cA and cB is decided by some function c(cA, cB), and then you
run an ordinary Condorcet method on the huge matrix and the winning
council is the one you pick.
For this particular method (I could really use a name -- if anyone has a
suggestion, feel free to say it), c(cA, cB) is the sum of another
function across all ballots. For a ballot b in the set of all ballots B,
say c(cA, cB) = SUM 1..n rep(cA, cB, b). rep() is short for
"representation" since that's what it's supposed to measure.
Now, onto rep(). To calculate rep(cA, cB, b), we'll need some constants
and derived variables. Say s is the number of seats and w is the weight
of ballot b.
Then the first step is to write down the rank numbers for each council
with respect to the ballot. The rank number for a candidate is 0 if
that candidate is ranked first, 1 if he's ranked second, and so on. Ties
share the highest rank (lowest rank number), but the next rank after the
equal-ranks is incremented by the number of equal-ranked candidates
(e.g. A>B=C>D has rank numbers 0113).
So if cA is XYZ and cB is XYW, and the ballot is X>A>W>Y>Z, then we get:
cA ranking numbers: 0 (X), 3 (Y), 4(Z) or 034.
cB ranking numbers: 0 (X), 3 (Y), 2(W) or 032.
Once that's done, make a list of all distinct rank numbers. Here, they
are 0234. Truncate this list at s (the number of seats) entries. The
truncated list here is 023 since there are three seats. Then count the
number of ranks in that list for each candidate council, and call these
counts sA and sB. If a voter ranks q candidates and q < s, only those q
candidates are listed.
Let's do that for the candidate council here. I'll replace the number
with a hyphen for each candidate that's in the list.
cA: 034, i.e. --4, or 2 in the list, so sA = 2.
cB: 032, i.e. ---, or 3 in the list, so sB = 3.
If the ballot instead had been X>Z, then only the listed candidates are
being considered, and we'd have had
cA: 04 and
cB: 0
The only distinct rank here would be the 0 and 4, so
cA: --
cB: -
sA = 2 and sB = 1.
We're almost done. Define f(x) to be the divisor generation function for
the divisor method of your choice. For Sainte-Lague, f(x) = 2x+1. Then,
rep(cA, cB, b) = w - w/f(sA), and rep(cB, cA, b) = w - w/f(sB).
-
As one may easily determine, in the one-seat case without ties, this
reduces to ordinary Condorcet. There's one seat, so rep(cA, cB, b)
gives w - w / f(1) to the candidate that wins, and w - w / f(0) to the
one that loses. Since f(0) = 1, w - w / f(0) = 0, so in effect, c(A, B)
is equal to the number of people who prefer A to B, times 2/3 (which is
a constant throughout and so cancels out).
There is a slight snag involving ties, though. Consider the one-seat
case with rep(A, B, b), with ballot b ranking A and B equal at top. The
ranking number is 0 for both, so both rep(A, B, b) and rep(B, A, b)
returns w - w / f(1). In effect, the function behaves like A=B means
"both A>B and B>A". Most people would consider that to be a bug.
I haven't found a proper, "continuous" solution, so for the time being,
return 0 whenever rep(cA, cB, b) = rep(cB, cA, b). Any suggestions to a
continuous solution (one that generalizes "smoothly" instead of
abruptly) would be welcome.
(Perhaps a certain person who has now retired would have liked this
method since it is Sainte-Lague based and also, by coincidence, behaves
pretty Approval-ish. But I don't think it passes the FBC.)
-
The whole ranking number business may seem rather arbitrary, which it in
a way is because I tried different approaches until I found one that
seemed to work... but I also had some criteria in mind and checked the
method against them.
The first is a subset independence criterion. This states that if you
add a bunch of candidates to both councils, that should increase both sA
and sB by the same amount. The ranking number function rep passes this
criterion as long as none of the added candidates are truncated: if you
add a bunch of candidates to both councils, s increases, so these
candidates will either both be counted on the cA and cB side, or on
neither. This criterion excludes the first function I tried: one where
you sort both cA and cB's ranking numbers in the same order, then go
from left to right, increasing sA when cA's number is less than cB's in
the column in question, and cB when cB's number is less than cA's. With
{cA: 012, cB: 123}, that idea fails this criterion.
The second is a one-candidate inferiority/monotonicity criterion. If the
councils are identical except for a single candidate, and b considers
the candidate in cB inferior, then it should always be the case that
rep(cA, cB, b) > rep(cB, cA, b) when w > 0. This one mostly serves to
exclude a minimax matching algorithm I tried before arriving at the
current rep(). The minimax matching would line up cA's and CB's ranking
numbers so that the number of times cA's column was greater than cB's
would be as close to the number of times cB's column was greater than
cA's as possible; and then for each column, cA would get a point if its
number was lesser than the other (i.e. candidate closer to the top). But
that violated this criterion and so I didn't use it.
The third is a reduction to Sainte-Lague party list when everybody
plumps for their party's list. This post is already pretty long, but
I'll sketch a proof. Say parties are A...N, the number of voters voting
for these parties is w_A...w_N, and the number of seats the parties get
in council x is s_N_x. Then CPO-SL indicates that the "nonrepresentation
sum" [SUM (R in A...N) w_R/f(s_R_x)] is minimized when x is the council
you would get by Sainte-Lague. Equivalently, [SUM (R in A...N) w_R -
w_R/f(s_R_x)] is maximized.
So we just need to show that when the voters plump, if b_R is the ballot
plumping for R and thus has weight w_R, rep(x, y, b_R) returns w_R - w_R
/ f(s_R_x). This would then imply that the Sainte-Lague council is the
CW and wins.
If each party has enough candidates to fill the whole council and there
are no ties, then the proof is simple. Every non-R candidate will have
ranking numbers greater than the number of seats. So those can never
contribute to sx (score in favor of council x). So sx is equal to the
number of R-candidates in x, i.e. s_R_x, and this is put into w_R - w_R
/ f(sx), giving w_R - w_R / f(s_R_X). QED.
If the voters only rank those they plump for, the proof is similarly
simple. Since truncated candidates aren't considered, then by the same
argument as above, only candidates in R can contribute to s_R_X. But if
the ballot ranks a party and then another, the reduction may fail, even
if the ballot puts all party members of the same party first.
-
So the method *almost* works. It has a few discontinuties when dealing
with ties and truncation - particularly the "wrong" reduction to
single-seat Condorcet (giving both A>B and B>A a point when A=B) and the
explicit disregard of truncated candidates instead of this arising from
the method itself. Those features both make this method more
Approvalish and hint that the reduction to Sainte-Lague with party list
isn't particularly robust.
So I would prefer, say, that the method still reduces to Sainte-Lague
with bloc plumping when the ballots are symmetrically completed. But I
can't see how to do that.
If you have suggestions as for how to make it be more robust, please let
me know. The whole "representativity per ballot" idea might have to be
altered into something that uses the whole ballot set at once. I don't know.
It might also be possible to use more well-known pairwise optimality
properties instead of w_x - w_x / f(sX). For instance, it could be
possible to use the Webster minimization property Warren mentions in
http://rangevoting.org/Apportion.html. One would then let the contest
between A and B be w_x * (sX/w_x - s/V)^2, where sX is the score for X
(the number of seats he "gets"), s is the number of seats in total, and
V is the number of voters (sum of all weights). I don't know if it would
generalize sufficiently, though; the best thing to do would be to check
if it would pass the mentioned reduction and then compare performance on
the proportionality/BR tradeoff curve.
More information about the Election-Methods
mailing list