Mutual Majority
Suppose there is a set of candidates $C = \{c_1,\dots, c_m\}$. According to the mutual majority criterion, a voting system must select a candidate from the smallest set $B = \{b_1, \dots, b_k\}$ of the $k \leq m$ highest ranked candidates whose combined support exceeds 50%. In other words, at least 50% of voters prefer candidates in $B$ to candidates in $C \setminus B$ and $k$ is the smallest number to satisfy this condition. As an example, consider the following preference profile from 6 voters:
rankings = [
[:a, :b, :c, :d, :e],
[:b, :a, :c, :d, :e],
[:a, :b, :c, :e, :d],
[:b, :a, :c, :d, :e],
[:e, :b, :c, :d, :a],
[:d, :a, :c, :b, :e]
]
Ranks(rankings)
Ranks
┌────────┬──────────────────────┐
│ Counts │ Ranks │
├────────┼──────────────────────┤
│ 1 │ [:a, :b, :c, :d, :e] │
│ 2 │ [:b, :a, :c, :d, :e] │
│ 1 │ [:a, :b, :c, :e, :d] │
│ 1 │ [:e, :b, :c, :d, :a] │
│ 1 │ [:d, :a, :c, :b, :e] │
└────────┴──────────────────────┘
The mutual majority set for the example above is $\{a,b\}$ because in the first four out of six rank orders, candidates $a$ and $b$ have the the highest rank orders, which exceeds 50% (i.e., $\frac{4}{6} \approx .66$).
Usage
The following example illustrates how to evaluate the Borda count voting system with respect to the mutual majority criterion. The code block below illustrates how to create a MutualMajority
criterion object.
using RankChoiceVoting
criterion = MutualMajority()
MutualMajority()
Satisfies
We can see which systems are guaranteed to satisfy the mutual majority criterion by calling satisfies
with the majority criterion object.
satisfies(criterion)
2-element Vector{VotingSystem}:
Bucklin()
InstantRunOff()
Example
Let's check whether mutual majority is violated in a different example. In the code block below, we will define a preference profile of $n=100$ voters for $m=4$ candidates.
data = [[:s,:t,:o,:p], [:t,:p,:o,:s],[:p,:t,:o,:s],[:o,:t,:p,:s]]
counts = [51,25,10,14]
rankings = Ranks(counts, data)
Ranks
┌────────┬──────────────────┐
│ Counts │ Ranks │
├────────┼──────────────────┤
│ 51 │ [:s, :t, :o, :p] │
│ 25 │ [:t, :p, :o, :s] │
│ 10 │ [:p, :t, :o, :s] │
│ 14 │ [:o, :t, :p, :s] │
└────────┴──────────────────┘
Now, create an Borda count voting system object:
system = Borda()
Borda()
In the code block below, we can determine the winner of the election with the function evaluate_winner
as follows:
evaluate_winner(system, rankings)
1-element Vector{Symbol}:
:t
In the next code block, we will use the function satisifies
to determine whether the Borda count system complies with the mutual majority criterion for the preference profile above.
criterion = MutualMajority()
satisfies(system, criterion, rankings)
false
which yields false for this example. To explore this result in more detail, we can use get_majority_set
to list the candidates in the mutual majority set $B$.
get_majority_set(rankings)
Set{Symbol} with 1 element:
:s
In this simple example, $B = \{s\}$, and the winning candidate $t \notin B$.