Continuing the discussion from Python Governance Electoral System:
Splitting off a new topic here.
This was a addressed in a sub-thread here, but not reflected in PEP 8001:
But nothing new to say about that
Continuing the discussion from Python Governance Electoral System:
Splitting off a new topic here.
This was a addressed in a sub-thread here, but not reflected in PEP 8001:
But nothing new to say about that
Could you run simulations with fewer candidate PEPs to see how much it makes things better?
PEP 8016 is very similar to PEP 8015 and both are very similar in spirit to my own PEP 8012. I would consider withdrawing 8012 if it increases the odds of avoiding a voting fiasco. I recall @steve.dower considered the same.
Sure, but itās not realistic. We shouldnāt let the voting system drive anything. āVote splittingā isnāt really a thing under Condorcet methods - at worst, two (or three ā¦) similar PEPs get ranked equally by voters, which may increase the chance of a tie. Big deal. Then we vote again - and thatās the point at which someone may wish to withdraw a PEP for āvoting system reasonsā.
Here are empirical probabilities of getting a flat-out Condorcet winner for various pairs of number of voters (in the first column) and number of candidates (in the first row). For example, if there are 12 voters and 2 candidates, the chance of a Condorcet winner is about 77%.
1 2 3 4 5 6 7
1 100 100 100 100 100 100 100
2 100 50 34 25 20 18 15
11 100 100 92 83 77 71 66
12 100 77 62 50 42 36 31
21 100 100 92 83 75 70 65
22 100 83 67 55 48 42 38
31 100 100 91 83 76 69 64
32 100 87 72 62 52 46 41
41 100 100 92 83 76 68 63
42 100 88 74 64 55 49 43
51 100 100 92 83 75 69 64
52 100 90 75 64 56 50 45
61 100 100 91 83 76 69 64
62 100 90 77 66 58 52 46
71 100 100 91 82 76 68 63
72 100 91 78 67 60 53 47
81 100 100 92 83 76 69 64
82 100 91 77 68 60 53 48
91 100 100 91 82 75 69 64
92 100 92 79 69 61 55 48
101 100 100 91 82 75 68 64
102 100 92 79 69 62 55 49
Notes:
Finally, hereās the code that produced the output above:
def probcw(ncands, nvoters):
from collections import defaultdict
from itertools import combinations
from random import shuffle
ntries = ncw = 0
oldmean = 0.0
cands = list(range(ncands))
V = defaultdict(int)
while True:
ntries += 1
V.clear()
for v in range(nvoters):
shuffle(cands)
for pair in combinations(cands, 2):
V[pair] += 1
winner = None
for i in cands:
if all(i == j or V[i, j] > V[j, i] for j in cands):
winner = i
break
if winner is not None:
ncw += 1
if ntries % 1000 == 0:
mean = round(ncw / ntries, 3)
if mean == oldmean:
return mean
oldmean = mean
print(" 1 2 3 4 5 6 7")
for nvoters in range(1, 102, 10):
for nvoters in range(nvoters, nvoters + 2):
print(f"{nvoters:3d}", end=" ")
for ncands in range(1, 8):
pcw = round(probcw(ncands, nvoters) * 100)
print(f"{pcw:3d}", end=" ")
print()
print()
FYI, some by-eyeball patterns in that table are legit:
As a sanity check, hereās a theoretical derivation of probabilities as the number of voters goes to infinity. There is no closed form expression, but there is a relatively simple integral of functions related to the normal distribution. The āinfinite number of votersā values in the table following are already approximately matched by the voters=31
row of the earlier table:
candidates | P(CW)*100 |
---|---|
1 | 100.0 |
2 | 100.0 |
3 | 91.2 |
4 | 82.5 |
5 | 74.9 |
6 | 68.5 |
7 | 63.1 |
8 | 58.5 |
9 | 54.5 |
Actually, thatās clear as mud . It is unrealistic, but correlations can push things in either direction, depending on their precise nature. In most studies Iāve stumbled into, the rate of Condorcet winners in real life elections were higher than the model above suggests - but in some studies, the rate was lower. So āit dependsā - but itās unclear on what it depends.