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:

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

  1. 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.
  2. 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.
  3. Prioritize completing monopolies over maximizing property count. monopolyPremium=1.25 and auctionMonopolyBonus=2.2 both 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).
  4. 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.
  5. Build steadily but don't over-leverage into hotels. buildThreshold=200 (only build if $200+ remains after paying for the house) and, notably, buildUpToHotel=false won: 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.
  6. Don't stay in jail voluntarily, and don't rush to pay bail either — it's situational. jailStayEarlyGame=false beat staying deliberately: once the board fills up with owned property, jail is not a safe haven — you still miss trading/building opportunities. But lateGameAlwaysPay=false also 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.
  7. 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.
  8. 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.8 is 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:

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.