# How Voting Systems Work 9, Exercise 3: how often do weight and power disagree? # Assumed model: 200 random systems of 5 voters, weights 1-12, quota = smallest strict majority. import random def banzhaf(weights, quota): n = len(weights) critical = [0] * n for mask in range(1 << n): members = [i for i in range(n) if mask >> i & 1] total = sum(weights[i] for i in members) if total >= quota: for i in members: if total - weights[i] < quota: critical[i] += 1 s = sum(critical) return [c / s for c in critical] random.seed(31) dummy_systems = monotone_breaks = big_gap = 0 worst = (0, None) for _ in range(200): w = [random.randint(1, 12) for _ in range(5)] q = sum(w) // 2 + 1 p = banzhaf(w, q) if 0 in p: dummy_systems += 1 for i in range(5): for j in range(5): if w[i] > w[j] and p[i] < p[j]: monotone_breaks += 1 # more weight but strictly less power gap = max(abs(p[i] - w[i] / sum(w)) for i in range(5)) if gap > 0.10: big_gap += 1 if gap > worst[0]: worst = (gap, (w, q, [round(x, 3) for x in p])) print("systems with a dummy voter:", dummy_systems, "of 200") print("cases of more weight but less power:", monotone_breaks) print("systems where some voter's power differs from weight share by over 10 points:", big_gap) print(f"largest gap {worst[0]:.3f} in weights {worst[1][0]}, quota {worst[1][1]}, Banzhaf shares {worst[1][2]}") # Output when run: # systems with a dummy voter: 46 of 200 # cases of more weight but less power: 0 # systems where some voter's power differs from weight share by over 10 points: 69 # largest gap 0.474 in weights [4, 10, 2, 2, 1], quota 10, Banzhaf shares [0.0, 1.0, 0.0, 0.0, 0.0]