Essay talk:RationalWiki election reform – electoral system

Clarification
Just seeing if I understand it properly.

For each possible pair of candidates ($$\tfrac{n!}{2(n-2)!}$$ pairs), check every single ballot with regards to the current pair and determine who comes in front. Positioning in that ballot is irrelevant, only how it relates to the other candidate.

Based on what proportion of the ballots involve a candidate being ahead, some amount of points are awarded.

Once all ballots for all pairings are considered, the points are totalled and used to rank the candidates.

Is this right? I'll see if I can prototype it in python if it is. —Kazitor, pending 03:42, 24 January 2018 (UTC)
 * Yes, that's right. Thanks for the help! CowHouse (talk) 03:46, 24 January 2018 (UTC)
 * Alright, see if I can make a functioning prototype. Good thing you've done all the hard work to determine what it should be. —Kazitor, pending 03:51, 24 January 2018 (UTC)

Miscount?
Did you count incorrectly? According to my work-in-progress prototype, Bigs v. Bongolian gives 8 to Bigs, 14 to Bongolian, 14 no preference.

Or do you count an appearance of one candidate but not the other as a preference for the one that appears? Is that a good idea? For instance, a candidate might appear but ranked very low, that should not count as a preference. —Kazitor, pending 05:00, 24 January 2018 (UTC)
 * Yes, I was counting an appearance as preferred to a non-appearance. According to this method, my count was correct. You have a point that this might not be the best idea. My solution would be to make clear that this is how votes are counted in the election booth area. That way, people will either rank all candidates or not rank the candidates they dislike. CowHouse (talk) 05:08, 24 January 2018 (UTC)
 * Besides, I would argue that an appearance almost always indicates a preference over a non-appearance. In the Bigs v Bongolian example, these were the votes your prototype considered to be non preferences: Bigs (1st) and Bongolian (3rd, 1st, 2nd, 4th, 3rd, 1st, 5th, 1st). CowHouse (talk) 05:31, 24 January 2018 (UTC)

Done
I altered the scoring slightly, draw is 0, marginal is ±1 and clear is ±2. This shouldn't affect the order, but makes it clear who's winning more than losing.

I also made votes mentioning a single person count as no preference (this is where it varies).

votes = [ (4,9,2,12,8,6,7,5,10), (9,12,5,2,7,3,6,8,10,4,1), (8,4,9,6,7,3,12,2,5,10,1,11,13), (5,7,2,12,9,10,8,3,4,6,1), (10,1,4,8,9,12,5,3,2,7,6), (7,2,3,12,6,9,10,5,4,8,11,1,13), (13,1,4,8,3,7,2,12,9,5,10,6,11), (9,8,4,2,7,12,3,6,5,10,13,1,11), (7,3,2,9,10,8,1,5,4,6,12,13,11), (6,9,4,12,2,8,5,7,10,1,3,13,11), (12,), (7,9,10,4,3,5,8,6,1,2,12,13,11), (9,4,12), (2,9,4,11,7), (1,6,9,8,7), (4,6,8,10,12,3,7,2,1,9), (9,3,11,7,5), (9,3,7,2,5,6,12,1,4,10,8,13), (1,2,3,4,5,6,7,8,9,10,11,12,13), (10,2,4,12,3,5,9,7,6,8,1,11,13), (3,9,7), (9,5,3,4,1,2,6,13,7,12,8,11,10), (12,2,7,9), (6,11,4,2,7,13), (11,9,10,1,4,6,7,2,3), (3,9,2,11,8,10,5,4), (11,9,10,6,4,3,1,7,2), (2,6,7,9,4,8,10,12,5), (2,7,6,3,4,1,5,10,12), (13,10,9,8,1,2,12,11,6,7,3,5,4), (9,12,4,7,2,8,11), (6,2,12,8,9,5,10,4,1,7,3,11,13), (11,), (7,2,8,12,5,9,3,4,6,10,1), (9,2,12,7,4,5,3,10,6,1,8,13,11), (2,5,8,9), ]

names=("Bigs", "Bongolian", "CheeseburgerFace", "Christopher", "Cosmikdebris", "CowHouse", "DiamondDisc1", "Kazitor", "LeftyGreenMario", "Nerd", "Pbfreespace3", "Spud", "Xbony2" )

scores=[0]*len(names)

for i in range(len(names)): for j in range(i+1,len(names)): prefs=[0]*3 # [cand i, none, cand j]		for vote in votes: try: if vote.index(i+1) < vote.index(j+1): prefs[0]+=1 else: prefs[2]+=1 except ValueError: prefs[1]+=1 #print(names[i],prefs[0],',',names[j],prefs[2],';',prefs[1])

conds=(prefs[1] <= len(votes)/2, (2*prefs[0] >= 3*prefs[2], 2*prefs[2] >= 3*prefs[0])) #(50% had preference, (60% preferred i, 60& preferred j))

if conds[0]: if conds[1][0]: scores[i]+=2 scores[j]-=2 elif conds[1][1]: scores[i]-=2 scores[j]+=2 else: if prefs[0] > prefs[2]: scores[i]+=1 scores[j]-=1 elif prefs[2] > prefs[0]: scores[i]-=1 scores[j]+=1 else: if conds[1][0]: scores[i]+=1 scores[j]-=1 elif conds[1][0]: scores[i]+=1 scores[j]-=1

scrOrdered=scores[:] scrOrdered.sort scrOrdered.reverse

for score in scrOrdered: print(score,':',names[scores.index(score)])
 * }

22 : LeftyGreenMario 17 : Bongolian 12 : Christopher 8 : DiamondDisc1 3 : CheeseburgerFace 0 : Spud -2 : Kazitor -3 : CowHouse -5 : Cosmikdebris -9 : Nerd -11 : Xbony2 -14 : Pbfreespace3 -18 : Bigs
 * }

So now it can be screwed around with to see how the output varies. —Kazitor, pending 05:31, 24 January 2018 (UTC)
 * Noting that bigs appears at the end, perhaps it could be that, if the other person isn't in the list, it goes by halfway-mark? Once again, my typical tendency to make things super complicated and more features than necessary... —Kazitor, pending 05:33, 24 January 2018 (UTC)
 * I think it's a mistake to make votes mentioning a single person count as no preference. For example, that would mean there is no difference between me voting for a candidate without ranking the other candidates, and not voting at all.
 * Thanks again for doing this. CowHouse (talk) 05:39, 24 January 2018 (UTC)
 * I do agree it's bad. If the election extension returns where each was ranked, that could be used. Presumably someone voting for one candidate would put them in position 1. All-in-all, I think it's a fairly good system but has a few flaws. And no need to thank me, I just needed something to do. —Kazitor, pending 05:42, 24 January 2018 (UTC)
 * To answer your earlier question, I found (apparently it's called the Kemeny-Young method). CowHouse (talk) 06:12, 24 January 2018 (UTC)
 * So was it possible to automate counting a ranked candidate over an unranked one? CowHouse (talk) 06:17, 24 January 2018 (UTC)
 * Yeah, I just haven't done it. —Kazitor, pending 07:10, 24 January 2018 (UTC)

Theoretical / mathematical backing
you seem to be suggesting that the head-to-head system is more robust to candidates. is there any empirical evidence for this? (it seems likely from the worked example, but hey) 18:06, 25 January 2018 (UTC)
 * In the link you cited it says "[i]n the research literature, what we are calling robust to candidates is referred to as independence of irrelevant alternatives, or IIA for short." It then mentions the Condorcet method and says "the Condorcet winner can rightfully be called the robust winner or the IIA winner." My system is similar to the which is a Condorcet method. I hope that answers your question. CowHouse (talk) 02:25, 26 January 2018 (UTC)
 * yup, just wanted to make sure you'd read some of the math behind these systems 13:36, 26 January 2018 (UTC)
 * So what do you think of the system? I'd appreciate some feedback if you have the time. CowHouse (talk) 07:00, 27 January 2018 (UTC)

I'm working on it
These tie-breakers are quite involved. Is there a simpler alternative?

I've sorted out the issue with names, the scores for 2016 are 27 : Reverend Black Percy 24 : FuzzyCatPotato 16 : Bongolian 16 : David Gerard 16 : Weaseloid 6 : DiamondDisc1 5 : CorruptUser 0 : Zero -2 : CheeseburgerFace -13 : Applesauce -13 : N7.Geth -15 : Avengerofthe BoN -21 : Pbfreespace3 -21 : Rational1 -25 : Hipocrite I like how Zero gets 0. I assume the fact that Avengerofthe BoN is near the end is a plus for your algorithm, though. —Kazitor, pending 21:52, 28 January 2018 (UTC)
 * Note that the tied candidates are not necessarily in the right order. Still working on that. —Kazitor, pending 21:53, 28 January 2018 (UTC)
 * I have encountered the classic issue with Concordet methods: in 2016, candidate 3 beats 5, 5 beats 11, and 11 beats 3 (3=Bongolian, 5=David, 11=Weaseloid). I'm not sure whether "If candidates are tied on points again, then look at first choice preferences and so on." will always resolve such a case. If this is to be seriously proposed as our new method, it better be flawless (lest we encounter another HCM) —Kazitor, pending 23:11, 28 January 2018 (UTC)
 * Great work, ! The fact that Zero gets 0 means this system is flawless. In all seriousness, I don't think a "flawless" system is possible. My argument is that it's significantly better than the status quo. I'm open to other tie-breaking ideas, but why would looking at first choice preferences, and so on, not resolve such cases?
 * It is a plus since I told that Avengerofthe BoN would have lost with this system. The fact they were 15 points behind 8th place is a bonus.
 * I'm not sure if you need the algorithm to work out ties. Would it be difficult to do it manually once everything else is calculated? CowHouse (talk) 06:10, 29 January 2018 (UTC)
 * Hm, doing things manually is just... wrong, you know? I've been working on it on-and-off for a while, and currently I'm re-organising it to make the tie-breaking stuff easier to implement. But you do have a point that manually resolving ties wouldn't be too hard. I do know, however, that the two two-way ties in the above sample are in the right order. It just needs to affect the actual output. —Kazitor, pending 06:17, 29 January 2018 (UTC)
 * I'd also imagine that we'd want to manually check the ties anyway, in order to ensure they're correct. I really hope this system gets implemented at some point considering how much you've been working on it. CowHouse (talk) 06:29, 29 January 2018 (UTC)
 * Like I've said, I'm not doing this to implement it (in that case I ought to be writing PHP... unless the RW server has a Python interpreter installed). I'm doing this for the sake of writing it. Although, it does seem like a good system. Just don't feel like it has to be used because of what I'm doing. —Kazitor, pending 06:58, 29 January 2018 (UTC)
 * Either way, thanks (again) for working on it. CowHouse (talk) 15:09, 29 January 2018 (UTC)