Source: matching-mechanics.md
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).
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.
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 |
U.S. undergraduate admissions is not a centralized matching system. This creates several problems:
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.
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.
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.
Strategic behavior: ED exists precisely because decentralized matching is unstable. Binding commitment reduces yield uncertainty for colleges and gives students a perceived admissions boost.
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."
/**
* 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>>
}
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.
| 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.
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.
| 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
| 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 |
When students commit by May 1, they release seats at every other school that admitted them. This triggers a chain reaction:
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.
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.
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
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;
}
}
}
}
}
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.
"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.
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.
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.
The combination of strategic ED, shotgun applications, and yield protection creates several inefficiencies:
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'
}
];
| 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 |
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.