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$.