2026-05-08__001_synthetic_mine_throughput__claude-code__claude-opus-4-7__nelson-v2-2-2-max-thinking

Date: 2026-05-08 · Benchmark: 001_synthetic_mine_throughput · Harness: claude-code · Model: claude-opus-4-7 (nelson-v2-2-2-max-thinking) · ? Unrecorded

Scores

Category Points Max
Conceptual modelling 19 20
Data and topology 14 15
Simulation correctness 19 20
Experimental design 14 15
Results & interpretation 14 15
Code quality 9 10
Traceability 5 5
Total 94 100

Run metrics

Source files

Downloads

Conceptual model

Conceptual Model — Synthetic Mine Throughput

System boundary

In scope. A single 8-hour ore-haulage shift on the synthetic mine topology in data/. The model represents trucks cycling between two ore loaders (LOAD_N, LOAD_S) and the primary crusher (CRUSH) over a directed road graph (junctions, ramps, haul roads, bypass). Capacity-1 road segments, loader service, and crusher service are modelled as constrained SimPy resources. All seven scenarios in data/scenarios/ are runnable.

Out of scope.

Entities

Resources

Events

Per cycle, in order:

  1. dispatched — truck departs current node with a chosen loader.
  2. enter_edge / leave_edge — once per capacity-1 edge traversed (in either direction).
  3. arrive_loader — truck reaches the loader node (queue length recorded).
  4. load_start — loader resource granted.
  5. load_end — loading service completes; truck is loaded.
  6. arrive_crusher — truck reaches the crusher node loaded.
  7. dump_start — crusher resource granted.
  8. dump_end — dumping completes; truck is empty. Throughput credited iff t ≤ 480 min.

State variables

Routing and dispatching

Stochasticity

Performance measures

Assumptions

Derived from the data

Introduced for the model

Limitations

README

Synthetic Mine Throughput Simulation

Discrete-event simulation of an 8-hour ore-haulage shift on a synthetic mine topology, built with SimPy. Estimates throughput to the primary crusher across seven scenarios, with Student-t 95% confidence intervals over 30 replications each.

1. Install

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

The simulation needs simpy, numpy, pandas, scipy, networkx, pyyaml, matplotlib, imageio, pillow. Tested on Python 3.11+.

2. Run

# Run all seven scenarios (six required + one combined) at 30 reps each.
PYTHONPATH=src python3 -m mine_sim run --data-dir data --output-dir .

# Or run a subset:
PYTHONPATH=src python3 -m mine_sim run --scenarios baseline,ramp_closed --output-dir .

# Generate the static topology image:
PYTHONPATH=src python3 -m mine_sim viz --data-dir data --output-dir . --scenario baseline

# Generate animation.gif from the existing event log (baseline rep 0):
PYTHONPATH=src python3 -m mine_sim viz --data-dir data --output-dir . --scenario baseline --animation --replication 0 --fps 8 --step-min 6.0

# Run the full pipeline end-to-end (experiment + topology + animation):
PYTHONPATH=src python3 -m mine_sim all --data-dir data --output-dir .

3. Outputs

FileContents
results.csvPer-replication metrics for all 7 scenarios × 30 reps.
summary.jsonPer-scenario aggregated means, 95% CIs, utilisations, top bottlenecks, plus model-wide assumptions and limitations.
event_log.csvTrace of dispatch, arrive/load/dump, and capacity-1 edge enter/leave events for the first three replications of each scenario (~36 k rows).
topology.pngStatic plot of the directed graph; capacity-1 edges in red.
animation.gifReplay of baseline replication 0 truck movements.

4. Reproducibility

5. Conceptual model

See conceptual_model.md for the full system boundary, entities, resources, events, state, and assumptions. Key design points:

6. Routing and dispatching

7. Key results (30 reps × 8 h shift)

ScenarioTrucksTonnes (95% CI)t/hCycle (min)Truck utilCrusher utilLoader util (N / S)
baseline812,503 [12,416 – 12,590]1,562.929.877 %91 %0.60 / 0.80
trucks_447,623 [7,594 – 7,652]952.924.592 %56 %0.32 / 0.51
trucks_121212,897 [12,810 – 12,983]1,612.142.755 %94 %0.64 / 0.85
ramp_upgrade812,557 [12,488 – 12,625]1,569.629.777 %91 %0.61 / 0.81
crusher_slowdown86,530 [6,455 – 6,605]816.255.349 %95 %0.33 / 0.44
ramp_closed812,393 [12,342 – 12,445]1,549.230.077 %90 %0.66 / 0.75
trucks_12_ramp_upgrade1212,877 [12,790 – 12,963]1,609.642.754 %94 %0.64 / 0.85

8. Operational decisions

Q1. What is expected throughput on the baseline 8-hour shift?

~12,500 tonnes / shift (1,562 t/h). The 95% CI is [12,416, 12,590] t — a narrow band, consistent with replicated observation that the shift is constrained by a saturated crusher rather than by stochastic variation.

Q2. What are the likely bottlenecks?

The primary crusher dominates. Composite bottleneck score (utilisation × mean_queue_wait) is the highest-ranking resource in every balanced scenario:

ScenarioTop bottleneck (composite)2nd3rd
baselineD_CRUSH 3.05L_S 1.97L_N 1.54
trucks_12D_CRUSH 13.36L_S 3.09L_N 1.99
crusher_slowdownD_CRUSH 25.05E03_UP 0.58L_S 0.39
ramp_closedL_N 3.14D_CRUSH 2.81L_S 1.65

The crusher is the binding constraint at 91–95% utilisation across baseline, trucks_12, and crusher_slowdown. Loader L_S (faster) is the secondary constraint; L_N is materially under-loaded in baseline.

The narrow ramp E03_UP is not a bottleneck in steady-state cycles, because the haul roads from J5 and J6 reach the crusher junction J4 directly (via E06_FROM_NORTH + E04_TO_CRUSH and E12_TO_CRUSH) without ever traversing the ramp. Ramp utilisation is ~5%, used only in the first cycle for PARK → LOAD_S dispatch.

Q3. Does adding more trucks materially improve throughput?

No — the system saturates between 8 and 12 trucks. Going from 4 → 8 trucks lifts throughput +64% (7,623 → 12,503 t/shift). Going from 8 → 12 trucks adds just +3.2% (12,503 → 12,897 t/shift), while truck utilisation falls from 77% to 55% and the crusher queue wait per truck triples (3.4 → 14.4 min per cycle). Marginal benefit per added truck collapses once the crusher saturates above 90% utilisation.

Q4. Would improving the narrow ramp materially improve throughput?

No — the gain is < 1 %. ramp_upgrade lifts baseline from 12,503 → 12,557 t (+0.43%, well within the CI). The reason: the ramp is bypassed in steady-state cycles. Loaded trucks return from the loaders to the crusher via J5 → J3 → J4 (north) and J6 → J4 (south), neither of which uses E03_UP or E03_DOWN. The ramp matters only for the initial PARK → LOAD_S dispatch and is rapidly amortised. Combining ramp_upgrade with trucks_12 also produces no extra value (12,877 vs 12,897, statistically a tie).

Operator implication: capital spent on widening or speeding up the main ramp would not pay back in additional ore at the crusher under the current fleet. The capital should be directed at the crusher (faster service, or adding a second crusher / hopper buffer) and at L_S (the busier loader).

Q5. How sensitive is throughput to crusher service time?

Highly sensitive — it scales nearly inversely. Doubling the crusher’s mean dump time from 3.5 → 7.0 min (crusher_slowdown) cuts throughput by 48% (12,503 → 6,530 t/shift). The crusher queue per cycle balloons from 3.4 to 26.9 min, while loader queues fall (because trucks now spend their time queued at the crusher, not at the loaders). Truck utilisation drops to 49%. Investments that shave service time at the crusher have direct near-linear throughput payoff.

Q6. What is the operational impact of losing the main ramp route?

Very small in steady state — about 1 %. ramp_closed reroutes the PARK → LOAD_S first dispatch via the longer western bypass (PARK → J1 → J2 → J7 → J8 → J6 → LOAD_S, +2.6 min loaded). Throughput drops 12,503 → 12,393 t/shift (-0.9%). Loader L_N picks up share (utilisation 0.60 → 0.66) because trucks initially routed to LOAD_S see the longer alternative path and the dispatch rule occasionally prefers L_N. The mine can safely operate without the main ramp; closing it for maintenance would barely move the production needle, contradicting the intuition that a “narrow ramp” implies a meaningful constraint.

Additional scenario: trucks_12_ramp_upgrade

This combination tests whether the ramp upgrade releases value once trucks are abundant. It does not — throughput tracks trucks_12 exactly (12,877 vs 12,897 t, statistically indistinguishable), confirming that the crusher remains the binding constraint regardless of upstream haul-road improvements.

9. Bottleneck summary

ResourceRoleNote
Crusher (D_CRUSH)Primary91–95% util in all balanced scenarios; near-linear sensitivity to service time.
Loader L_SSecondaryFaster service (4.5 vs 6.5 min) means the dispatch rule prefers it; util ≈ 80 %.
Loader L_NReserveUtil 60 % in baseline; absorbs traffic when alternatives queue up (e.g. ramp_closed).
Ramp E03_UP/DOWNNon-bindingBypassed in steady state; ~5 % util.
Pit roads E07, E09Non-bindingSingle-lane, but cycle frequency keeps utilisation < 50 %.

10. Limitations

11. Suggested improvements

12. Project layout

.
├── data/                             # Static inputs (provided)
├── src/mine_sim/
│   ├── __init__.py
│   ├── __main__.py                   # CLI: run / viz / all / list-scenarios
│   ├── data.py                       # Typed CSV loaders
│   ├── scenarios.py                  # YAML scenario loader + inheritance + combo
│   ├── topology.py                   # Override-applied DiGraph + reachability check
│   ├── routing.py                    # Static shortest-time + dispatch rule
│   ├── simulation.py                 # SimPy DES core (one rep)
│   ├── stats.py                      # Student-t CI + utilisation helpers
│   ├── experiment.py                 # Multi-rep runner + summary aggregation
│   └── visualise.py                  # topology.png + animation.gif
├── conceptual_model.md
├── README.md                         # this file
├── results.csv
├── summary.json
├── event_log.csv
├── topology.png
└── animation.gif

← Back to leaderboard