Matching Mechanics: Gale-Shapley Algorithm & Simulation Timeline

Source: matching-mechanics.md


Matching Mechanics: Gale-Shapley Algorithm & Simulation Timeline

1. The Gale-Shapley Algorithm (Stable Marriage Problem)

1.1 What is the Stable Marriage Problem?

The Stable Marriage Problem (SMP) asks: given two equal-sized sets of participants, each with a ranked preference list over all members of the other set, can we find a matching where no pair of participants would prefer each other over their assigned partners?

A matching is unstable if there exist two participants A and B who are not matched to each other but both prefer each other over their current partners. A stable matching eliminates all such "blocking pairs."

In 1962, mathematicians David Gale and Lloyd Shapley proved that a stable matching always exists for any set of preference lists, and published an algorithm to find one. In 2012, the Nobel Memorial Prize in Economic Sciences was awarded to Alvin E. Roth and Lloyd Shapley "for the theory of stable allocations and the practice of market design." Roth's contribution was demonstrating how Gale-Shapley could be applied to real-world markets --- most notably the National Resident Matching Program (NRMP) for medical residencies, and public school choice systems in New York City (2003) and Boston (2005).

1.2 How Does Gale-Shapley Work?

The algorithm operates through iterative propose-and-reject rounds (also called "deferred acceptance"):

Pseudocode (Student-Proposing Variant for College Admissions):

FUNCTION GaleShapley(students, colleges):
    // Each student has a ranked preference list of colleges
    // Each college has a ranked preference list of students and a quota (capacity)
    // Initialize all students as "free" (unmatched)
    // Initialize each college's tentative roster as empty

    WHILE there exists a free student who hasn't been rejected by all colleges:
        student = pick any free student with remaining proposals
        college = next college on student's preference list (not yet proposed to)

        IF college has open slots (roster.size < quota):
            college.roster.add(student)
            student.status = "tentatively matched"

        ELSE IF college prefers student over its least-preferred current match:
            displaced = college.roster.removeLeastPreferred()
            displaced.status = "free"
            college.roster.add(student)
            student.status = "tentatively matched"

        ELSE:
            // college rejects student; student remains free
            student.rejectedBy.add(college)

    // When no free students remain with proposals left, all tentative matches become final
    RETURN all college rosters

Key properties: - Termination: The algorithm always terminates in at most nm iterations (n students, m colleges). - Stability: The resulting matching is always stable --- no student-college pair would mutually prefer each other over their assigned match. - Proposer-optimality: In the student-proposing variant, each student gets the best possible college they could get in any stable matching. Conversely, colleges get their worst stable matching partner. - Truthfulness*: It is a dominant strategy for proposers (students) to report their true preferences. However, colleges (receivers) can sometimes benefit from misrepresenting their preferences.

1.3 Application to College Admissions

The original Gale-Shapley paper was literally titled "College Admissions and the Stability of Marriage" (1962). The college admissions problem is a many-to-one extension of the stable marriage problem where each college has a quota (number of seats).

Where it matches real admissions: - Students rank colleges by preference. - Colleges rank applicants by desirability (academic index, hooks, essays, fit). - Both sides seek the "best" match they can get. - The concept of stability maps to the intuition that no student should be left at a worse school when a better school would have preferred them over someone they admitted.

Where it diverges --- critically:

Feature Gale-Shapley (Centralized) Real U.S. Undergrad Admissions
Matching system Centralized clearinghouse Decentralized, uncoordinated
Information Complete preference lists Incomplete --- colleges don't know students' full lists
Rounds Iterative propose-reject Fixed deadlines (ED, EA, RD)
Binding All matches final simultaneously Only ED is binding; students hold multiple offers
Strategy Truthful for proposers Highly strategic (ED signaling, demonstrated interest)
Timing Simultaneous Sequential rounds create information asymmetry

1.4 Why Decentralized Matching Creates Instabilities

U.S. undergraduate admissions is not a centralized matching system. This creates several problems:

  1. Students hold multiple offers: After RD decisions, students may hold 5-10 acceptances simultaneously until May 1. Colleges cannot fill those seats until students release them.

  2. Yield uncertainty: Colleges must predict how many admitted students will actually enroll ("yield"). If yield is too low, they under-enroll; too high, they over-enroll. This forces over-admission and waitlists as buffers.

  3. Yield cascades: When a student commits to Harvard, they release seats at Yale, Duke, and Northwestern. Those schools pull from waitlists, which releases seats at schools further down, creating a domino effect.

  4. Strategic behavior: ED exists precisely because decentralized matching is unstable. Binding commitment reduces yield uncertainty for colleges and gives students a perceived admissions boost.

  5. Congestion: With 1.5M+ Common App users averaging 6.8 applications each (2024-25 data), colleges process millions of applications with significant overlap in applicant pools.

Research by Che and Koh (2016, Journal of Political Economy) formally showed that "decentralized (but coordinated) markets exhibit congestion, and the resulting outcome is unstable."

1.5 JavaScript Implementation Sketch

/**
 * Gale-Shapley Deferred Acceptance Algorithm
 * Student-proposing variant for college admissions (many-to-one)
 */
function galeShapley(students, colleges) {
  // Initialize: all students are free, all college rosters empty
  const free = new Set(students.map(s => s.id));
  const proposals = new Map(); // studentId -> index into their preference list
  const rosters = new Map();   // collegeId -> Set of studentIds

  for (const s of students) proposals.set(s.id, 0);
  for (const c of colleges) rosters.set(c.id, new Set());

  // Build college preference rankings for O(1) comparison
  const collegeRank = new Map(); // collegeId -> Map(studentId -> rank)
  for (const c of colleges) {
    const rankMap = new Map();
    c.preferenceList.forEach((sid, idx) => rankMap.set(sid, idx));
    collegeRank.set(c.id, rankMap);
  }

  // College quota map
  const quota = new Map();
  for (const c of colleges) quota.set(c.id, c.seats);

  while (free.size > 0) {
    // Pick an arbitrary free student
    const studentId = free.values().next().value;
    const student = students.find(s => s.id === studentId);
    const propIdx = proposals.get(studentId);

    // Student has exhausted all proposals
    if (propIdx >= student.preferenceList.length) {
      free.delete(studentId);
      continue;
    }

    const collegeId = student.preferenceList[propIdx];
    proposals.set(studentId, propIdx + 1);

    const roster = rosters.get(collegeId);
    const ranks = collegeRank.get(collegeId);

    if (roster.size < quota.get(collegeId)) {
      // College has open slot --- tentatively accept
      roster.add(studentId);
      free.delete(studentId);

    } else if (ranks.has(studentId)) {
      // Find the least-preferred current member
      let worstId = null;
      let worstRank = -1;
      for (const memberId of roster) {
        const r = ranks.get(memberId) ?? Infinity;
        if (r > worstRank) { worstRank = r; worstId = memberId; }
      }

      // If college prefers new student over its worst current match
      if (ranks.get(studentId) < worstRank) {
        roster.delete(worstId);
        free.add(worstId);
        roster.add(studentId);
        free.delete(studentId);
      }
      // else: college rejects student, student stays free
    }
  }

  return rosters; // Map<collegeId, Set<studentId>>
}

2. Deferred Acceptance vs. Immediate Acceptance

2.1 How NRMP Uses Deferred Acceptance

The National Resident Matching Program (NRMP), established in 1952, is the textbook example of centralized deferred acceptance in practice. Before the NRMP, the medical residency market was chaotic --- hospitals were making offers up to two years in advance, creating a classic market unraveling problem.

How the NRMP Match works: 1. In February, medical students submit a Rank Order List (ROL) of residency programs. 2. Residency programs submit their own ROL of applicants. 3. The Roth-Peranson algorithm (an extension of Gale-Shapley, student-proposing) runs centrally. 4. On "Match Day" (mid-March), all matches are revealed simultaneously.

Critical properties of the NRMP: - Strategy-proof for students: Truthful reporting of preferences is the dominant strategy. Students cannot game the system by ranking programs strategically. - Stable outcome: No student-program pair would mutually prefer each other over their assigned match. - Simultaneous resolution: All matches are announced at once --- no sequential decision-making, no yield uncertainty.

2.2 Why Undergraduate Admissions is NOT Like the NRMP

NRMP (Centralized) Undergrad Admissions (Decentralized)
Single clearinghouse processes all preferences Each college makes independent decisions
One Match Day Multiple decision rounds (ED, EA, RD) spanning 6 months
Binding for both sides Only ED is binding; RD admits hold multiple offers
Students rank truthfully (optimal strategy) Students signal strategically (ED choice, demonstrated interest)
No yield problem Yield is the central challenge
No waitlists needed Waitlists are essential buffers

The key reason undergraduate admissions remains decentralized is that colleges want to evaluate holistically (essays, interviews, fit) and maintain institutional control over their process, which doesn't lend itself to a single algorithmic clearinghouse. Additionally, students are choosing life experiences (campus culture, location, social fit), not just career placements.

2.3 The Common App's Role

The Common Application (launched 1975, went digital in 1998) created a near-simultaneous game by: - Reducing application friction: Students can apply to many schools with one application. - Enabling "shotgun" strategies: Average applications per student rose from ~3 in the 1990s to 6.8 in 2024-25, with top students sending 15-25. - Creating overlapping applicant pools: The most selective 50 schools are largely competing for the same ~50,000 top students. - Driving down acceptance rates: More applications per student means more applications per school, which mechanically lowers acceptance rates even without changes in selectivity.

In 2024-25, 1.5 million distinct applicants submitted over 10 million applications through the Common App alone.


3. Simulation Tick Structure

3.1 Real Admissions Calendar (2025-2026 Cycle)

Phase Application Deadline Decision Release Student Response
ED I (Early Decision I) Nov 1 (some Nov 15) Mid-December (~Dec 15) Binding: must enroll, withdraw all other apps
REA/SCEA (Restrictive Early Action) Nov 1 Mid-December (~Dec 15) Non-binding, but can only apply REA to one private school
EA (Early Action) Nov 1-15 (some Dec 1) Mid-December to January Non-binding; students respond by May 1
ED II (Early Decision II) Jan 1-15 Mid-February (~Feb 15) Binding: must enroll, withdraw all other apps
RD (Regular Decision) Jan 1-15 (some Feb 1) Late March - Early April (~Mar 28) Non-binding; students respond by May 1
Ivy Day (same as RD) Late March (all 8 Ivies release same day) Non-binding; respond by May 1
May 1 (NCRD) --- --- National Candidate Reply Date: students commit + deposit
Waitlist --- May through July Rolling: colleges pull from waitlist as deposits come in

REA Schools (as of 2025-26): - Harvard, Yale, Princeton, Stanford (all use Restrictive Early Action / Single-Choice Early Action) - REA students MAY also apply EA to public universities and non-binding rolling admissions - REA students may NOT apply ED or EA to other private institutions

For the simulation, model admissions as 6 discrete ticks, each representing a phase of the real calendar:

Tick 0: SETUP
  - Generate all student agents with attributes (GPA, SAT, ECs, hooks)
  - Generate all college agents with capacities and preferences
  - Students form preference lists and application strategies

Tick 1: EARLY ROUND (November - December)
  Phase 1a: ED I Applications
    - Students with a clear first-choice apply ED I (binding)
    - ED applicants can only apply ED to ONE school
  Phase 1b: REA/SCEA Applications
    - Students apply REA to one of: Harvard, Yale, Princeton, Stanford
    - REA students may NOT apply ED or EA to other private schools
  Phase 1c: EA Applications
    - Students may apply EA to multiple schools (non-binding)
    - EA schools include MIT, Georgetown, UChicago, Notre Dame, UVA, etc.

  COLLEGES REVIEW AND DECIDE:
    - ED I: Accept (binding), Reject, or Defer to RD
    - REA: Accept, Reject, or Defer to RD
    - EA: Accept, Reject, or Defer to RD

  STUDENT RESPONSES:
    - ED I admits: COMMIT (remove from all other pools)
    - REA/EA admits: Hold offer, continue to RD
    - Deferred students: Enter RD pool

Tick 2: ED II ROUND (January - February)
  - Students not committed who want binding commitment apply ED II
  - Only students rejected/deferred from ED I or who didn't apply early are eligible
  - Colleges review and decide: Accept (binding), Reject, or Defer to RD

  STUDENT RESPONSES:
    - ED II admits: COMMIT (remove from all other pools)
    - Rejected/deferred: Enter RD pool

Tick 3: RD ROUND (January - March/April)
  - All remaining uncommitted students apply RD to their remaining schools
  - This is the largest application pool
  - Colleges review the FULL pool (fresh RD apps + deferred ED/EA students)
  - Colleges must model expected yield to determine how many to admit

  DECISIONS:
    - Accept, Reject, or Waitlist
    - Yield modeling: admit ~(target class size / expected yield rate) students

Tick 4: STUDENT DECISION (April - May 1)
  - Students with multiple offers choose ONE school
  - Decision factors: preference rank, financial aid, fit
  - Students commit by May 1 (NCRD) and pay deposit
  - All other offers are released

Tick 5: WAITLIST RESOLUTION (May - July)
  - Colleges assess whether their enrolled class is under-target
  - If under-enrolled: pull students from waitlist in preference order
  - Waitlisted students who already committed elsewhere must choose:
    - Stay with committed school, OR
    - Accept waitlist offer (lose deposit at previous school)
  - This may cascade: a student leaving School B for School A opens a spot at B
  - Iterate until all colleges meet target or exhaust waitlist

3.3 What Happens in Each Tick

Tick Who Acts What Happens Key Mechanic
0 System Generate agents, form preferences Agent initialization
1 Students apply, colleges decide ED/REA/EA round Binding commitment, signaling
2 Students apply, colleges decide ED II round Second-chance binding
3 Students apply, colleges decide RD round Yield prediction, largest pool
4 Students choose Commit to one school Multi-offer resolution
5 Colleges pull from waitlist Fill remaining seats Yield cascade

4. The Yield Cascade (Waitlist Mechanics)

4.1 How the Yield Cascade Works

When students commit by May 1, they release seats at every other school that admitted them. This triggers a chain reaction:

  1. Student commits to Harvard -> releases seats at Yale, Duke, Northwestern, Michigan
  2. Yale fills from waitlist -> that student releases seat at Georgetown, UCLA
  3. Georgetown fills from waitlist -> that student releases seat at Boston College
  4. Cascade continues down the prestige hierarchy until all schools are at capacity

This is analogous to a topological sort through the preference graph, where higher-prestige schools get their picks first and lower schools absorb the cascading releases.

4.2 Waitlist Movement Data by School Tier

HYPSM Tier (acceptance from waitlist is very rare):

School Offered WL Accepted WL Admitted from WL WL Accept Rate
Harvard Not disclosed Not disclosed Not disclosed ~0-5% (estimated)
Yale ~1,000 ~600-800 0-25 ~0-4%
Princeton ~1,200 ~800 1-180 (varies wildly) 0.15%-16.4%
Stanford ~750 ~450 5-15 ~1.8% avg (utilization 2.13%)
MIT ~600 ~450 20-75 ~5-12%

Ivy+ Tier (low but more consistent waitlist movement):

School Offered WL Accepted WL Admitted from WL WL Accept Rate
Columbia Not disclosed Not disclosed Not disclosed Estimated 0-5%
UPenn ~3,000 ~1,500 40-250 2-17% (varies)
Brown ~2,000 ~1,000 50-150 ~5-15%
Dartmouth ~2,000 ~1,200 25-100 ~2-8%
Cornell ~5,500 ~3,500 100-260 ~3-7% (utilization 4.78%)
Duke ~3,500 ~2,000 50-200 ~3-10% (utilization 9.87%)
Northwestern ~3,000 ~1,500 10-100 ~1-7%
UChicago ~3,000 ~1,500 50-200 ~3-13%

Near-Ivy / Selective Tier (more waitlist movement):

School Offered WL Accepted WL Admitted from WL WL Accept Rate
Vanderbilt ~5,000 ~3,000 80-200+ ~3-7% (utilization 14.66%)
WashU ~4,000 ~2,000 80-150+ ~4-8%
Carnegie Mellon ~10,000 ~5,000 30-100 ~0.3-2%
Emory ~5,000 ~3,000 50-200 ~2-7%
Michigan ~15,000 ~8,000 50-100 ~0.5-1.5%
UCLA ~8,000 ~5,000 200-500 ~4-10% (utilization 12%)

Key insight for simulation: Waitlist utilization varies enormously by year and by school. The safest modeling approach is to give each college a waitlistPullRate parameter (typically 0-15% of waitlist acceptors) that represents the average fraction admitted from the waitlist.

4.3 Average Waitlist Patterns

From aggregate data (College Transitions, CDS forms): - Overall: ~20% of students who accept a waitlist position eventually get admitted - Most selective schools (T10): ~0-7% pull rate - Selective schools (T10-T30): ~3-15% pull rate - For the Class of 2025: only 15% of students accepting a waitlist spot were admitted (down from 32% for Class of 2024, a 46% decline year-over-year) - 61% of sampled schools admitted 10% or less from their waitlist for Class of 2025

4.4 Modeling the Cascade in Simulation

function resolveWaitlist(colleges, students) {
  let changed = true;
  while (changed) {
    changed = false;
    // Process colleges in prestige order (highest first)
    const sortedColleges = [...colleges].sort((a, b) => b.prestige - a.prestige);

    for (const college of sortedColleges) {
      const deficit = college.targetClassSize - college.enrolledCount;
      if (deficit <= 0 || college.waitlist.length === 0) continue;

      // Pull top-ranked waitlisted students
      const toPull = Math.min(deficit, college.waitlist.length);
      for (let i = 0; i < toPull; i++) {
        const student = college.waitlist.shift(); // already sorted by college preference
        if (student.committed && student.committedTo !== college.id) {
          // Student must choose: stay committed or switch
          if (student.prefers(college.id, student.committedTo)) {
            // Release seat at previous school
            const prevCollege = colleges.find(c => c.id === student.committedTo);
            prevCollege.enrolledCount--;
            prevCollege.needsWaitlistPull = true;

            student.committedTo = college.id;
            college.enrolledCount++;
            changed = true; // cascade continues
          }
        } else if (!student.committed) {
          student.committedTo = college.id;
          student.committed = true;
          college.enrolledCount++;
          changed = true;
        }
      }
    }
  }
}

5. Game Theory: Strategic Behavior in College Admissions

5.1 ED as a Strategic Commitment Device

Early Decision is fundamentally a credible commitment mechanism that solves a coordination problem:

The College's Problem: "Will this student actually enroll if we admit them?" Without binding commitment, colleges face yield uncertainty. They might admit 2,000 students hoping 500 will enroll, but get 700 (over-enrollment crisis) or 300 (under-enrollment crisis).

The Student's Problem: "How can I signal that this school is truly my first choice?" In a sea of 50,000+ applicants, demonstrated interest through ED is the strongest possible signal.

Game-theoretic framing: - ED is a screening mechanism: it separates students who genuinely prefer a school from those using it as a safety option. - ED creates a signaling equilibrium: students who apply ED reveal private information (true preference) in exchange for a perceived admissions boost. - The "boost" exists partly because ED pools are genuinely self-selected (more committed, often better-prepared applicants) and partly because colleges reward the certainty of 100% yield.

ED acceptance rate data (Class of 2029 and recent cycles):

School ED Rate Overall Rate ED Multiplier
Brown 14.4% 5.4% 2.7x
Columbia 13.2% 3.9% 3.4x
Dartmouth 19.1% 5.4% 3.5x
Duke 19.7% 6.7% 2.9x
Emory 23.2% 10.2% 2.3x
Northwestern 23.0% 7.7% 3.0x
Rice 16.8% 7.9% 2.1x
UPenn 14.2% 5.4% 2.6x
WashU 25.2% 12.0% 2.1x
UVA (ED) 27.9% 16.8% 1.7x
Amherst 29.3% 9.0% 3.3x
Middlebury 30.5% 10.7% 2.9x
Williams 23.3% 8.3% 2.8x

On average across selective schools, ED applicants see approximately a 1.6x to 3.5x increase in acceptance probability compared to RD.

REA/SCEA rates (non-binding early, HYPSM):

School REA/EA Rate Overall Rate Multiplier
Harvard (REA) ~9% 3.6% 2.5x
Yale (SCEA) 10.8% 4.5% 2.4x
Princeton (SCEA) ~10% ~4% ~2.5x
Stanford (REA) ~8% ~3.9% ~2.1x
MIT (EA) 5.2% 4.5% 1.2x

Note: MIT's EA rate is barely above its overall rate, suggesting MIT genuinely evaluates all rounds equally. The HYPSM REA boosts are smaller than ED boosts at other schools, partly because REA is non-binding.

5.2 Demonstrated Interest as a Signaling Mechanism

"Demonstrated interest" is a secondary signal that some colleges track: - Campus visits, information session attendance, alumni interviews - Opening marketing emails, engaging with admissions portal - "Why Us" supplemental essay quality

Schools that heavily track demonstrated interest: Tulane, American, Northeastern, Lehigh, Case Western, many LACs.

Schools that explicitly do NOT track it: All Ivies, Stanford, MIT, Caltech, most UCs.

This is closely related to yield protection (also called "Tufts Syndrome"): the practice of waitlisting or rejecting overqualified applicants who show no demonstrated interest, on the assumption they will attend a higher-ranked school. Schools associated with yield protection include Tufts, Tulane, UChicago, Emory, Case Western, Northeastern, and several UC campuses.

5.3 The "Shotgun" Strategy

Problem: Students face uncertainty about where they'll be admitted. Solution: Apply broadly to diversify risk.

Why shotgunning is individually rational but collectively harmful: - For the student: More applications = higher probability of at least one acceptance at a top choice. Given stochastic admissions decisions, applying to 20 schools with 5% acceptance rates gives you a ~64% chance of at least one admit, vs. ~14% with 3 applications. - For the system: More applications per student -> more applications per school -> lower acceptance rates -> more perceived selectivity -> students apply to even MORE schools. This is a positive feedback loop that makes the system increasingly congested and anxiety-producing. - For colleges: More applications creates more yield uncertainty (harder to predict who will actually enroll), driving increased reliance on ED and waitlists.

5.4 The Prisoner's Dilemma of Early Decision

ED creates a classic prisoner's dilemma for students:

Student B applies ED Student B applies RD
Student A applies ED Both locked in early (potentially suboptimal financial aid) A gets ED boost, B faces tougher RD pool
Student A applies RD B gets ED boost, A faces tougher RD pool Both compete in full RD pool (status quo)

The dominant strategy for each student (given the other might apply ED) is to apply ED, even though the collectively optimal outcome might be for neither to use binding commitment. This is especially inequitable because: - Wealthy students can afford to commit via ED without comparing financial aid packages. - Low-income students need to compare aid offers, making RD the rational choice, but they pay a penalty in lower RD acceptance rates.

5.5 Suboptimal Outcomes from Strategic Behavior

The combination of strategic ED, shotgun applications, and yield protection creates several inefficiencies:

  1. Misallocation: Students commit binding to ED schools before seeing all options; some would prefer a school they never got to compare.
  2. Inequity: ED advantages wealthy applicants who don't need to compare financial aid.
  3. Information destruction: Colleges must guess at yield instead of knowing preferences, leading to over-admission + waitlists as a correction mechanism.
  4. Arms race: Colleges compete to fill via ED (Duke fills ~50% of class via ED), reducing RD spots and making RD increasingly competitive.
  5. Anxiety cascade: Lower acceptance rates (driven by shotgunning) create more anxiety, driving more shotgunning.

6. Recommendations for Simulation Implementation

6.1 Which Matching Approach to Use

Recommended: Hybrid sequential-round model with Gale-Shapley-inspired preference resolution.

Do NOT implement pure Gale-Shapley, because: 1. Real undergrad admissions is decentralized, not centralized. 2. Students don't submit complete preference lists upfront. 3. The sequential round structure (ED -> EA -> EDII -> RD -> WL) is the core mechanic that creates interesting dynamics.

Instead, use Gale-Shapley logic within each round for the resolution step:

For each round:
  1. Students submit applications (based on strategy + preferences)
  2. Colleges score and rank applicants
  3. Colleges admit top-N (where N = remaining capacity / expected yield)
  4. In binding rounds (ED/EDII): accepted students commit immediately
  5. In non-binding rounds (EA/RD): students hold offers
  6. After RD: students use preference ordering to choose (Gale-Shapley-like resolution)
  7. Waitlist cascade fills remaining gaps
const SIMULATION_TICKS = [
  {
    id: 'ED1',
    name: 'Early Decision I',
    appDeadline: 'Nov 1',
    decisionDate: 'Dec 15',
    binding: true,
    eligibleColleges: (c) => c.offersED,
    yieldMultiplier: 1.0,  // 100% yield for binding round
    admitRateMultiplier: 1.6  // ~60% higher admit rate in ED
  },
  {
    id: 'REA',
    name: 'Restrictive Early Action',
    appDeadline: 'Nov 1',
    decisionDate: 'Dec 15',
    binding: false,
    eligibleColleges: (c) => c.offersREA, // Harvard, Yale, Princeton, Stanford
    yieldMultiplier: 0.75,  // ~75% yield for REA admits
    admitRateMultiplier: 2.3 // REA boost
  },
  {
    id: 'EA',
    name: 'Early Action',
    appDeadline: 'Nov 1-15',
    decisionDate: 'Dec-Jan',
    binding: false,
    eligibleColleges: (c) => c.offersEA, // MIT, Georgetown, Notre Dame, UVA, etc.
    yieldMultiplier: 0.55,  // moderate yield
    admitRateMultiplier: 1.3 // slight EA boost
  },
  {
    id: 'ED2',
    name: 'Early Decision II',
    appDeadline: 'Jan 1',
    decisionDate: 'Feb 15',
    binding: true,
    eligibleColleges: (c) => c.offersEDII,
    yieldMultiplier: 1.0,
    admitRateMultiplier: 1.4 // ED II boost (slightly less than ED I)
  },
  {
    id: 'RD',
    name: 'Regular Decision',
    appDeadline: 'Jan 1-15',
    decisionDate: 'Mar 28',
    binding: false,
    eligibleColleges: (c) => true, // all schools
    yieldMultiplier: null,  // school-specific historical yield
    admitRateMultiplier: 1.0 // baseline
  },
  {
    id: 'COMMIT',
    name: 'Student Decision Day',
    date: 'May 1',
    action: 'Students with multiple offers choose one school'
  },
  {
    id: 'WAITLIST',
    name: 'Waitlist Resolution',
    dateRange: 'May-July',
    action: 'Colleges pull from waitlist to fill remaining seats'
  }
];

6.3 Key Parameters to Calibrate

Parameter Source Typical Range
ED admit rate multiplier CDS data per school 1.5x - 3.5x over RD
REA/EA admit rate multiplier Published early rates 1.2x - 2.5x over overall
Historical yield rate CDS data 20% (safety) to 80% (HYPSM)
Waitlist pull rate CDS waitlist data 0-15% of waitlist acceptors
Application count per student Common App data 5-20 (varies by archetype)
ED application probability Student archetype 30-60% of top students apply ED
Defer-to-RD rate (early rounds) Institutional data 50-70% of early applicants

6.4 Summary

The simulation should model college admissions as a multi-round decentralized matching market with: - Sequential rounds (ED -> EA/REA -> EDII -> RD -> Commit -> Waitlist) - Strategic student behavior (ED signaling, shotgun applications) - College yield modeling (over-admit + waitlist buffer) - Yield cascades during waitlist resolution - Hook multipliers and random noise to create realistic variance

This approach captures the essential dynamics that make college admissions interesting: it is NOT a stable matching (unlike NRMP), and the instabilities, strategic behavior, and cascading effects are precisely what make it worth simulating.


Sources