Starting the log, and where the project stands
First entry. From here on I’ll write a short note at the end of each working day.
Where things are
The simulator plus LLM scheduler is working for the blind and full information settings. Last week I added the partial setting, where the scheduler sees noisy grade estimates along exploratory drillholes, and ran a batch of rolling-horizon MILP experiments on it (rolling_milp_partial.py).
I also cleaned up the codebase into the cleaned/ folder and built a block model viewer notebook to inspect what each scheduler actually extracts period by period.
A case worth reporting: waste cover
A uniform low-grade surface with no visible signal of where the ore is, and a rich zone underneath.
| Method | NPV | vs full MILP |
|---|---|---|
| Blind MILP | 3,282.81 | −53.0% |
| Greedy | 6,809.30 | −2.4% |
| Full MILP | 6,978.63 | — |
Greedy beats blind MILP by a wide margin here. Greedy fills the available capacity in every period. The blind MILP can’t see the lower levels, so it spreads extraction across every surface block at once and never commits to digging down to the ore.
Next
- Run the partial (drilling) case on the same instance and see how much of the gap a few drillholes close.
- Add drilling cost to the NPV comparison so the trade-off is honest.
- Write up the remaining cases for the report.