Voting Rules
DemocracySim aggregates ballots inside an election. The rules differ only in how they turn the participating agents' ballots into a collective ordering. Costs, rewards, participation learning, and later grid mutation are part of the broader election loop and are documented in core_mechanics.md and participation_learning.md.
Ballots And Option Space
In this model, an election option is not a single color but a complete ordering
of the colors. With four colors, the option set therefore consists of all
4! = 24 possible color orderings.
Each participating agent submits a disagreement vector over these options. Lower disagreement is better. A voting rule maps the profile of these vectors to a full collective ordering of the options, and the top-ranked option is then interpreted as the elected color ordering.
This representation matters for reading the rules below. The rules are not choosing directly among colors, but among complete orderings of colors.
approval is kept as a context arm. It remains useful for comparison and
calibration, but it is not part of the canonical confirmatory family.
Rule Mapping In Runtime
The runtime mapping used by model.rule_idx is:
0 = plurality1 = approval2 = utilitarian3 = borda4 = schulze5 = random
For where this appears in configuration and stored run artifacts, see run_control_output.md.
Rule Definitions
Utilitarian
utilitarian aggregates ballots directly on the disagreement scores. For each
option, it sums disagreement across participating agents and ranks options from
lower to higher total disagreement. In this sense, it selects the option with
the smallest collective disagreement.
Borda
borda first converts each ballot into an ordering of the options by ascending
disagreement. On a set of m options, the top-ranked option receives m - 1
points, the next m - 2, and so on down to 0. These points are summed
across participating agents, and options are ordered from higher to lower total
Borda score.
Schulze
schulze also works on induced rankings per ballot. For two options a and
b, an agent counts as preferring a to b if the disagreement score of a
is strictly lower than the disagreement score of b. Exact ties are neutral.
The resulting pairwise comparison matrix is then aggregated with the Schulze
strongest-path method to obtain a collective ordering.
Because the candidate set here is the full option space of color orderings, Schulze is guarded against very large option counts for runtime reasons.
Plurality
plurality uses only first choices. Before counting, ties among equally best
options within a ballot are broken with seeded tie preparation. The plurality
winner is then the option with the largest number of first-choice votes.
Because the model requires a full collective ordering rather than only a winner, the lower ranks are completed after the plurality stage by seeded random ordering of the remaining options.
Approval
approval maps disagreement scores to binary approvals with a fixed threshold
tau = 0.5. An option is approved if its disagreement score is below that
threshold. Options are ordered first by approval count, then by lower total
disagreement, and only then by seeded random tie resolution.
Random
random ignores ballot content and draws a full ordering uniformly at random
from the available options. Because the draw is seeded, the result is still
reproducible for a fixed run seed.
No-Participation Case
If no agents participate in an election, no new aggregate ranking is computed. The previous elected ordering remains in force. If the election has no previous ordering yet, the current realized ordering of the area is used instead.
For the broader consequences of that case within the election pipeline, see core_mechanics.md.
Tie Handling And Reproducibility
Decision-relevant randomized tie handling is seeded. For a fixed seed, the same run reproduces the same ballot preparation, tie resolution, and final ordering.