# How Voting Systems Work 4, Exercise 2: Copeland and Minimax on a cycle # Three groups with rotated rankings (assumed numbers: 12, 9 and 6 voters). # Compute Copeland scores and Minimax worst defeats, and see what each method does. ballots = ( [("Ann", "Ben", "Cat")] * 12 + [("Ben", "Cat", "Ann")] * 9 + [("Cat", "Ann", "Ben")] * 6 ) names = sorted(ballots[0]) wins = {(x, y): sum(1 for b in ballots if b.index(x) < b.index(y)) for x in names for y in names if x != y} for x in names: for y in names: if x < y: print(f"{x} vs {y}: {wins[x, y]} to {wins[y, x]}") copeland = {x: sum((wins[x, y] > wins[y, x]) - (wins[x, y] < wins[y, x]) for y in names if y != x) for x in names} minimax = {x: max([wins[y, x] for y in names if y != x and wins[y, x] > wins[x, y]], default=0) for x in names} print("Copeland scores:", copeland) print("Minimax worst defeats:", minimax) best = min(minimax.values()) print("Copeland winners:", [x for x in names if copeland[x] == max(copeland.values())]) print("Minimax winners:", [x for x in names if minimax[x] == best]) # Output when run: # Ann vs Ben: 18 to 9 # Ann vs Cat: 12 to 15 # Ben vs Cat: 21 to 6 # Copeland scores: {'Ann': 0, 'Ben': 0, 'Cat': 0} # Minimax worst defeats: {'Ann': 15, 'Ben': 18, 'Cat': 21} # Copeland winners: ['Ann', 'Ben', 'Cat'] # Minimax winners: ['Ann']