The Carousel Drop Problem — Mock Experiment Report

Companion experiments for _posts/2026-08-19-carousel-problem.md. Model: belt occupancy is i.i.d. Bernoulli(p) per cell, so the true free run A ∼ Geom(p); the detector reveals only the censored run G = min(A, ℓ); bag width W is drawn from a known distribution and revealed only on collision. A policy is a stopping time τ adapted to the observed history, bounded by a hard deadline T. The optimal policy solves the Bellman recursion V0(g) = c(g),   Vk(g) = min{ c(g), E[Vk-1(Gt+1) | Gt=g] }. All figures below are pure black/white/gray — line style and marker shape (not hue) distinguish series; heatmap cells use grayscale shading only.

Experiment 0 — Validate the analytic model against raw-bit simulation

Parameters: ℓ=3, p=0.25, n_trials=400,000. The analytic transition kernel and cost function are derived from the memoryless (geometric) belt assumption; here they are checked against a simulator that generates actual i.i.d. bits and reads off G_t directly, with no shortcuts.

Exp 0a — marginal law of G: analytic vs. Monte Carlo-0.03380.06410.1620.260.3580.4560123g (observed censored free run)P(G = g)analyticempirical (raw-bit MC, n=400k)
ganalytic_pmfempirical_pmfabs_diff
0.00.25000.25090.00089
1.00.18750.18720.00030
2.00.14060.14080.00013
3.00.42190.42120.00072

Max abs. difference 0.00089, below the ~1/√n ≈ 0.00158 Monte Carlo noise floor.

Transition kernel P(Gt+1=g' | Gt=g)

Analytic

g'=0g'=1g'=2g'=3
g=00.250.18750.1406250.421875
g=11.00.00.00.0
g=20.01.00.00.0
g=30.00.00.250.75

Empirical (raw-bit MC)

g'=0g'=1g'=2g'=3
g=00.25090.18540.14000.4238
g=11.00000.00000.00000.0000
g=20.00001.00000.00000.0000
g=30.00000.00000.24990.7501

Result: PASSED — analytic kernel matches simulation within Monte Carlo noise.

Experiment 1 — Bellman-optimal policy vs. baseline policies

Parameters: ℓ=2, p=0.2, T=5, W ∼ Geometric(q=0.4, mean width 2.5), 300,000 Monte Carlo trials per policy. Baselines: drop immediately, wait for the hard deadline, the naive “drop when the detector reports a fully clear view” heuristic (the airport rule at general ℓ), and swept fixed thresholds θ.

Exp 1 — analytic collision probability by policy (lower is better)bellman_optimal0.1470naive_greedy (g==ell)0.1500threshold_theta=20.1500threshold_theta=10.2308threshold_theta=00.3846immediate_drop0.3846wait_to_deadline0.3846threshold_theta=30.3846
policyanalytic_collision_probmc_collision_probmc_mean_stop_delayn_trials
bellman_optimal0.14700.14820.773300,000
naive_greedy (g==ell)0.15000.14890.779300,000
threshold_theta=20.15000.15050.782300,000
threshold_theta=10.23080.23140.251300,000
threshold_theta=00.38460.38460.000300,000
immediate_drop0.38460.38470.000300,000
wait_to_deadline0.38460.38805.000300,000
threshold_theta=30.38460.38405.000300,000

The Bellman-optimal policy is the empirical best (confirmed by both the exact analytic evaluation and independent 300k-trial Monte Carlo), beating the naive greedy rule by 2.0% (0.1500 → 0.1470).

Experiment 2 — threshold structure of the optimal policy

Parameters: ℓ=4, p=0.2, T=10, W ∼ Geometric(q=0.35, mean 2.86). Tests the post's open conjecture: is the optimal policy of the form “drop iff Gt ≥ θk”, with θk non-increasing as the deadline approaches (k → 0)?

Exp 2a — optimal threshold vs. remaining slack-0.320.6081.542.463.394.32012345678910k (steps of slack remaining; k=0 is the deadline)θₖ (drop iff observed g ≥ θₖ)optimal threshold θₖ
Exp 2b — optimal value vs. remaining slack (at g=0)-0.080.1520.3840.6160.8481.08012345678910k (steps of slack remaining)optimal collision prob. Vₖ(0)Vₖ(g=0)
k_remainingtheta_kis_threshold_formV_k(fresh_g=0)
00True1.0000
11True0.4167
22True0.3000
33True0.2393
43True0.2078
53True0.1768
64True0.1578
74True0.1414
84True0.1279
94True0.1170
104True0.1086

Every row is exactly a threshold rule in g: True. θk is monotone non-decreasing in k, i.e. non-increasing as k → 0 (the policy gets less picky as the deadline nears): True. Both parts of the conjecture hold in this instance.

Experiment 3 — what one more cell of view is worth

Parameters: p=0.2, T=6, W ∼ Geometric(q=0.3, mean 3.33), ℓ swept 0–12. Tests the post's second conjecture: does VT*(ℓ) saturate, and near what statistic of W?

Exp 3 — value of one more cell of view-0.03640.06910.1750.280.3850.4910123456789101112ℓ (field of view, cells)optimal collision prob. V*(ℓ)V*(ℓ)
ellV_starmarginal_gain_over_ell_minus_1
0.00.45455—
1.00.318190.13635
2.00.227000.09119
3.00.187010.03999
4.00.181000.00600
5.00.18100-0.00000
6.00.181000.00000
7.00.18100-0.00000
8.00.181000.00000
9.00.181000.00000
10.00.181000.00000
11.00.181000.00000
12.00.181000.00000

Marginal gain from one more cell of view falls below 1% of the total observed gain at ℓ* = 5 (E[W]=3.33, median(W)=2) — saturation sits a little past the mean width, consistent with the conjecture that extra view beyond the bulk of the width distribution buys almost nothing.

Experiment 4 — sensitivity to belt congestion p and deadline slack T

Parameters: ℓ=2, W ∼ Geometric(q=0.4, mean 2.5); p ∈ {0.1,0.2,0.3,0.4}, T ∈ {0,1,2,3,5,8}. Grayscale only encodes magnitude (darker = higher value); no color is used.

Optimal collision probability V*(p, T) — darker = worse

p \ T012358
0.10.21740.13910.09690.08560.07920.0783
0.20.38460.26150.20250.17100.14700.1396
0.30.51720.37240.31160.26290.21710.1940
0.40.62500.47500.41500.36100.29760.2532

Relative reduction vs. immediate drop (%) — darker = bigger win

p \ T012358
0.10.036.055.460.663.664.0
0.20.032.047.455.661.863.7
0.30.028.039.849.258.062.5
0.40.024.033.642.252.459.5

Waiting helps most exactly where you'd expect: low congestion (small p) with enough slack (large T) gets close to a 64% relative cut in collisions versus always dropping immediately; even at the most congested setting tested (p=0.4) the optimal policy still nearly halves the collision rate once T ≥ 3.

Summary

Generated by make_report.py from the CSVs in results/, which were produced by run_experiments.py (seed 20260829).