3.3 A Look at Power
Consider the voting system . Notice that in this system, player 1 can reach quota without the support of any other player. When this happens, we say that player 1 is a dictator.
In the voting system , no player is a dictator. However, in this system, the quota can only be reached if player 1 is in support of the proposal; player 2 and 3 cannot reach quota without player 1’s support. In this case, player 1 is said to have veto power. Notice that player 1 is not a dictator, since player 1 would still need player 2 or 3’s support to reach quota.
With the system , player 3 is said to be a dummy, meaning they have no influence in the outcome. The only way the quota can be met is with the support of both players 1 and 2 (both of which would have veto power here); the vote of player 3 cannot affect the outcome.
To better define power, we need to introduce the idea of a coalition. A coalition is a group of players voting the same way. In the example above, would represent the coalition of players 1, 2 and 4. This coalition has a combined weight of , which meets quota, so this would be a winning coalition.
A player is said to be critical in a coalition if them leaving the coalition would change it from a winning coalition to a losing coalition. In the coalition , every player is critical. In the coalition , no player is critical, since it wasn’t a winning coalition to begin with. In the coalition , only players 1 and 2 are critical; any other player could leave the coalition and it would still meet quota.
# Math in Society 3.3 -- A Look at Power: dictators, veto power, dummies
# A weighted voting system is written [q: w1, w2, ...] -- quota, then weights.
from itertools import combinations
def analyse(q, w, label=""):
n, total = len(w), sum(w)
idx = range(n)
winning = [c for k in range(1, n + 1) for c in combinations(idx, k)
if sum(w[i] for i in c) >= q]
critical = [sum(1 for c in winning
if i in c and sum(w[j] for j in c if j != i) < q) for i in idx]
print(f"{label}[{q}: {', '.join(map(str, w))}] total weight {total}"
f" {len(winning)} of {2**n - 1} coalitions win")
if q * 2 <= total:
print(" !! the quota is not more than half the weight: two opposing")
print(" coalitions could both reach quota, so nothing gets decided")
if q > total:
print(" !! the quota exceeds the total weight: nothing can ever pass")
for i in idx:
if w[i] >= q:
tag = "DICTATOR -- reaches quota alone"
elif critical[i] == 0:
tag = "DUMMY -- never critical, so never matters"
elif total - w[i] < q:
tag = "VETO POWER -- critical in every winning coalition"
else:
tag = "ordinary player"
print(f" P{i+1} weight {w[i]:>3} critical {critical[i]:>3}x {tag}")
print()
analyse(16, [7, 6, 3, 3, 2])
analyse(10, [11, 3, 2])
for q in (10, 12, 16): # EDIT: try other quotas for the same weights
analyse(q, [10, 5, 3])
analyse(65, [47, 46, 17, 16, 2], "Scottish Parliament 2009 ")
print("Raising the quota on a fixed set of weights walks each player up the same")
print("ladder: dummy -> ordinary -> veto power. A dictator can only appear when one")
print("weight on its own already reaches the quota.")
print("Try it: analyse(q, [4, 4, 4, 1]) for every q from 5 to 13 and find the quota")
print("at which the 1-weight player stops being a dummy.")
Notice that a player with veto power will be critical in every winning coalition, since removing their support would prevent a proposal from passing.
Likewise, a dummy will never be critical, since their support will never change a losing coalition to a winning one.
Adapted from Math in Society by David Lippman, hosted on LibreTexts (math.libretexts.org) and licensed under CC BY-SA 3.0. Changes were made. License: CC-BY-SA-3.0.