EconCSLib.SocialChoice.FairDivision.Indivisible.RoundRobin #
The choice round-robin algorithm and its EF1 correctness proof, stated on the
canonical bundled AdditiveInstance interface.
Main definitions #
bestGood— argmax helper: an element ofsmaximizing an agent's item weightroundRobinAux— recursive core: agents take turns picking their best remaining goodroundRobinAllocation— the complete round-robin allocation for an additive instanceroundRobinRule— a feasible-allocation rule induced by round-robin
Main results #
roundRobinAllocation_isAllocation— the output is a valid partition ofI.allGoodsroundRobinAllocation_isEF1— the output satisfies EF1 for nonnegative weightsroundRobinRule_isEF1— rule-style EF1 correctness
Algorithm #
Agents are ordered 0, 1, ..., n-1, 0, 1, ... (cycling mod n). In each step the
current agent picks their highest-weight remaining good. The implementation recurses on
remaining.card with accumulator A : Allocation (Fin n) G.
EF1 proof outline #
Fix distinct agents i, j : Fin n.
Case i.val < j.val (i picks before j in every round):
When i picks their r-th good i_r in round r, agent j's round-r good j_r is
still in the pool (j hasn't picked yet that round). Since i picks optimally,
v_i(i_r) ≥ v_i(j_r). Summing over rounds: v_i(A_i) ≥ v_i(A_j) — agent i does not
envy j at all (stronger than EF1). Any good in A_j is therefore a valid EF1 witness
(use monotonicity: removing a good can only decrease value).
Case j.val < i.val (j picks before i in every round):
When i picks their r-th good i_r in round r, agent j's next good j_{r+1} is
still in the pool (j picks in round r+1, after i picks in round r). So v_i(i_r) ≥ v_i(j_{r+1}).
Telescoping over r = 0, …, |A_j| − 2:
v_i(A_i) ≥ Σ_r v_i(j_{r+1}) = v_i(A_j) − v_i(j_0),
i.e., v_i(A_j \ {j_0}) ≤ v_i(A_i), where j_0 is j's first picked good (EF1 witness).
Proof technique #
All proofs use strong induction on remaining.card via Finset.strongInductionOn,
with case splits on turn = i, turn = j, turn ≠ i ∧ turn ≠ j handled via
Function.update_apply.
The EF1 correctness proofs use two-part invariants maintained across rounds:
roundRobin_noEnvy_of_earliermaintainsv_i(A j) ≤ v_i(A i)(no-envy) plus a headroom conditionv_i(A j) + w_i(g) ≤ v_i(A i)for all remainingg, active when agentihas picked in the current cycle butjhas not yet (i.val < turn.val ≤ j.val).roundRobin_ef1_of_latermaintains a two-phase invariant: Phase 1 (beforej's first pick) and Phase 2 (afterjpicks witnessg0:v_i(A j \ {g0}) ≤ v_i(A i)with conditional headroom guarded byi.val < turn.val ∨ turn.val ≤ j.val).
References #
- Lipton et al., "On Approximately Fair Allocations of Indivisible Goods" (EC 2004)
- Nisan et al., Algorithmic Game Theory, Chapter 11
Raw implementation layer #
The public algorithm below is stated on AdditiveInstance. The recursive proof
machinery is parameterized by the raw induced valuation to keep the induction
lemmas independent of bundled-record projection noise.
Best-item selection #
Round-robin algorithm #
Unfolding lemmas #
Partition properties #
EF1 correctness #
Bundled additive-instance API #
bestGood lies in the candidate set.
Every candidate good has no larger weight than bestGood.
Recursive core of round-robin for bundled additive instances.
Equations
- SocialChoice.FairDivision.Indivisible.roundRobinAux I turn remaining A = SocialChoice.FairDivision.Indivisible.rawRoundRobinAux✝ I.toAdditiveValuation turn remaining A
Instances For
The complete choice round-robin allocation for a bundled additive instance.
Equations
- SocialChoice.FairDivision.Indivisible.roundRobinAllocation I = SocialChoice.FairDivision.Indivisible.roundRobinAux I ⟨0, ⋯⟩ I.allGoods fun (x : Fin n) => ∅
Instances For
Round-robin as a feasible-allocation rule on bundled additive instances.
Equations
Instances For
roundRobinAllocation produces a complete partition of the instance goods.
Round-robin gives EF1 for additive instances with nonnegative item weights.
The bundled round-robin rule is EF1 under nonnegative item weights.