Best Monopoly Strategy
derived from simulation
This is the output of simulating ~415,000 4-player games across five rounds
of search with a headless rules engine (monopoly/js/game.js): an initial
~72,000-game coordinate ascent over 17 parameters (monopoly/sim/gridsearch.js),
two follow-up rounds adding 4 more parameters (~230,000 games,
gridsearch2.js/gridsearch3.js), a fourth round adding
trade-scarcity awareness after a human playtester found an exploit (~32,000 games,
gridsearch4.js), and a fifth round testing three ideas pulled from published
human/AI Monopoly strategy research (~58,000 games) that all tested neutral and were
reverted. The winning parameter set (BEST_GENOME in
monopoly/js/strategy.js) beat:
- The un-tuned baseline strategy: 40–41% win rate in 4-player games (vs. 25% fair share)
- A hand-crafted “monopoly rush” bot (buys aggressively into monopolies, trades eagerly): 31% (its closest rival)
- “Aggressive buyer”, “conservative/hoarder”, “jail camper”, and “rail collector” archetypes: 36–46%
All comparisons rotate the tested strategy through all 4 seats evenly across trials, because seat/turn order alone produces a large effect (~36% win rate for seat 1 vs ~20% for seat 4 among identical bots) — without controlling for that, any strategy comparison is meaningless.
The strategy, in plain English
-
Buy almost everything early, but not recklessly. The winning bot buys any
property as long as it leaves at least ~$300 (later reduced to ~$200 threshold for
building) in the bank, and is more willing to buy than the naive default. Cash starvation
from over-buying was worse than missing a property, but under-buying was worse still
— the biggest single lever in the whole search was
tradeWillingness=0(never trade) crashing win rate to ~7.5%, showing that hoarding without ever trading is close to a losing strategy on its own. - Bid aggressively in auctions, especially for monopoly-completing properties. The best genome bids up to ~120% of a property's “fair value” (list price adjusted for how contested the color group is), and applies a 2.2x bonus to fair value when the property would complete one of its own monopolies. Rails are valued above face price (1.4x) — rail sets are cheap, easy to complete, and produce steady rent without needing to build. Utilities are valued below face price (0.9x) — they're the weakest asset class in the game.
-
Prioritize completing monopolies over maximizing property count.
monopolyPremium=1.25andauctionMonopolyBonus=2.2both push hard toward finishing color sets rather than collecting scattered singles, because rent only meaningfully spikes once you own a full group (2x rent with no houses, or building starts). -
Trade proactively — this was the single biggest factor.
tradeWillingness=0.75: the winning bot actively proposes trades (offering cash + occasionally a property) to complete its own near-finished color groups, and evaluates incoming offers by comparing estimated asset value (with a monopoly-completion bonus) against what's being asked, only accepting when it comes out at least 1.75x ahead in estimated value. Being trade-averse is the costliest mistake in the parameter space — worse than any single mis-tuned buy/build threshold. -
Build steadily but don't over-leverage into hotels.
buildThreshold=200(only build if $200+ remains after paying for the house) and, notably,buildUpToHotel=falsewon: it's better to spread 3–4 houses across every monopoly you own than to rush any single group to a hotel and leave yourself cash-poor. Three houses already captures most of the rent jump; the marginal rent from a 4th house or hotel isn't worth the liquidity risk in a 4-player game where opponents can still bleed you dry with a big rent bill at a bad moment. -
Don't stay in jail voluntarily, and don't rush to pay bail either — it's
situational.
jailStayEarlyGame=falsebeat staying deliberately: once the board fills up with owned property, jail is not a safe haven — you still miss trading/building opportunities. ButlateGameAlwaysPay=falsealso won over always paying immediately: if you're cash-tight, the free “hide from rent” turns in jail are worth taking rather than paying $50 you need for building. Net effect: pay bail when you can comfortably afford it and have monopolies to develop; otherwise ride it out. -
Moderate risk aversion beats both extremes.
riskAversion=0.7(fairly conservative) beat both a YOLO-spend bot and a hyper-conservative hoarder. The winning balance keeps enough of a cash cushion to survive a bad rent roll but doesn't sit on cash that should be converted into monopolies and houses. -
Guard partial color groups jealously, and don't sell the second piece cheaply.
groupScarcityPremium=1.5: once you already own one member of a group, giving up another member of that same group is priced far above sticker — scaled by how many you already hold, since a 2-of-3 holder is sitting on the single most valuable property left on the board (either rival will pay almost anything for the third piece). This was added specifically because a human playtester found that AI opponents would sell the second piece of a group for close to face value without reasoning that the third piece then becomes drastically harder for them to get.chaseLastPieceDrive=1.8is the flip side: the bot now offers well above “fair” to grab the missing piece of its own near-complete group first, rather than losing that race to a sharper opponent. Tested directly against a “trades aggressively to complete color groups” opponent (the same shape as the human exploit): its win rate against 3 defenders dropped from 19.4% to 11.1% once the defenders used this genome.
Summary heuristic a human can actually use at the table
Buy nearly everything you land on if you can afford it. Bid hard in auctions, especially for anything that completes a color group — go up to ~120% of sticker price for those. Chase monopolies over scattered properties, and don't be shy about offering cash to close a trade that finishes your set — trade-averse players lose. Build 3–4 houses across all your monopolies before pushing any single one to a hotel. Keep a few hundred dollars in reserve at all times. In jail, pay bail only when you're flush and have something productive to do with the turn; otherwise sit tight for free. And once you own even one piece of a color group, don't sell it (or any other piece of that group you pick up) cheaply — the fewer unclaimed pieces remain, the more each one is worth to whoever's racing you for the set.
This exact parameter set (BEST_GENOME) is what powers the in-game AI opponents
in the game itself — beating them in the actual game means
beating the empirically best strategy found across the whole search.
Follow-up search: ~230,000 more games, no improvement found
After the initial search, I ran two more rounds (gridsearch2.js,
gridsearch3.js, ~230,000 additional games total) to see if a deeper search or
new parameters could beat BEST_GENOME. Four new dimensions were added: which
color group to develop first when multiple are buildable (cheap vs. expensive), whether to
hoard Get Out of Jail Free cards once holding 2+ monopolies instead of trading them away, an
explicit “blocking awareness” that overpays in auctions/trades to deny opponents a
monopoly-completing property, and evening out house sales across groups when forced to
liquidate.
Result: none of it beat BEST_GENOME. The first extra round
(gridsearch2.js) actually produced a genome that lost to
BEST_GENOME head-to-head (20–24% win rate, well below a fair 25% share)
— traced to a real methodology bug in plain coordinate ascent: comparing each candidate
only to the “current best so far” lets an early bad/noisy choice quietly drag down
the baseline the rest of that pass gets judged against, so worse changes can look like
improvements relative to an already-weakened baseline. gridsearch3.js fixed this
by re-validating every accepted change against the original fixed BEST_GENOME
anchor (not the drifting running best) — and even with that guard, the resulting genome
still landed at 20–23% vs. the anchor. Isolating all 14 parameter differences
individually (n=1200 each, enough statistical power to detect a ~2.5 percentage-point true
effect) showed every single one sitting within noise of 25% — none of them is a real
improvement on its own; the combined genome's loss came from many
statistically-neutral-or-slightly-negative changes compounding.
The practical takeaway: BEST_GENOME is a genuine local (and likely close to
global, for this parameterization) optimum for this rule engine — not just a strategy
nobody has tried to beat yet. All four new mechanics (build order, jail-card hoarding,
opponent-blocking, even house selling) are implemented in strategy.js and
available on the genome, but none measurably changes win rate at the sample sizes tested, so
BEST_GENOME kept its round-1 values for them — until round 4 found a real
gap in exactly this space (below).
Round 4: closing a human-exploitable blind spot (~32,000 games)
A human playtester reported a working exploit: own two of a three-property color group,
offer an AI opponent holding the third piece a merely-fair price, and it would often sell
— without reasoning that giving up its own piece killed its own shot at that group, or
that the human's piece was now worth far more than sticker to whoever chased it next.
blockingAwareness from the earlier rounds didn't cover this: it only reasons about
whether a trade completes the other player's set, as a flat multiplier, and tested at
0.0 (off) in BEST_GENOME because it hadn't shown a measurable benefit
in isolation.
Two new parameters were added and drift-safe coordinate-ascent searched
(gridsearch4.js, ~18,400 games): groupScarcityPremium (demand a
steeply higher price to give up a property from a group you already partially own, scaled by
how many members you hold) and chaseLastPieceDrive (offer substantially more than
“fair” to acquire your own group's last piece before a rival gets there first). The
result, groupScarcityPremium=1.5 / chaseLastPieceDrive=1.8, beat the
round-3 anchor at 45.5–45.7% win rate (confirmed at both n=4,000 and
n=6,000). Tested directly against the exploit itself — a bot that trades maximally
aggressively to complete color groups, the same shape as the human strategy — its win
rate against 3 defenders dropped from 19.4% to 11.1% once the defenders used
the new genome (n=1,000 each side). A broader archetype check (~24,600 games) confirmed the
gain generalized: the new genome beat every tested archetype by roughly 6–9 percentage
points more than the old genome did, with only a small (3.2pp) give-back specifically against
the group-hoarder archetype in a narrow one-hoarder-vs-one-defender framing.
Round 5: three more ideas from published strategy research, all neutral (~58,000 games)
To look for further gains, I pulled concrete heuristics from published human/AI Monopoly strategy write-ups that weren't yet modeled, implemented each one, and head-to-head tested it in isolation against the round-4 genome. All three came back statistically neutral (within noise of a fair 25% share) and were reverted:
-
“Rush every property in a group to 3 houses before hoteling any”
(common advice: rent jumps steepest at the 3rd house) — tested at 25.5% win rate
vs. the existing build order (n=3,000), and actually regressed the archetype aggregate
slightly (45.6%→45.0%, n=9,600). Likely redundant: the engine already caps building
more than 1 house ahead of a group's minimum (
canBuildOningame.js), so development was already close to even without an explicit bias. - “Mortgage properties furthest from a monopoly first, protect rails/utilities” — tested at 25.0–25.3% (n=3,000 and n=8,000). Forced liquidation apparently doesn't come up often enough in these simulated games for its internal ordering to matter.
- “Size cash reserve to the worst rent reachable in the next ~2 rolls” instead of a flat minimum — swept 5 candidate strengths, best candidate confirmed at 25.30% (n=3,000). No signal at any strength tested.
This isn't evidence the underlying human advice is wrong at the table — only that, given
how this engine's other heuristics are already tuned (buildCheapGroupsFirst,
riskAversion, the even-build engine rule, the liquidation fallback in
raiseCash), these particular refinements don't move the needle further here.
BEST_GENOME is unchanged from round 4.