A 100 MWh / 25 MW grid-connected battery in the NYISO Zone J day-ahead market needs an hourly schedule for the next 24 hours. The optimizer picks a power level for each hour — positive sells to the grid, negative buys from it — subject to physical constraints: state-of-charge must stay between 10 % and 90 %, and round-trip efficiency is 85 %. Score is total revenue across the day. Two distinct price peaks (a small morning ramp and a big 5 pm evening peak) mean the optimum is a two-cycle dispatch, which most algorithms find only after they discover the midday charging window. 24-D continuous problem.
Pick a dispatch strategy and watch the day play out.
24-D problem. Population methods do well; trust-region needs restarts to use the full budget.
Each row is the best schedule a given algorithm found (more $/day = better).
| Algorithm | $/day | Schedules | Detail |
|---|---|---|---|
| — no runs yet — | |||
The battery is a 100 MWh / 25 MW asset — a 4-hour-duration
Li-ion utility-scale system. Each hour the dispatcher picks a
power level in [−25, +25] MW (charge or discharge). The state
of charge updates as
SoC(h+1) = SoC(h) − p·Δt / η_d when discharging
and SoC(h+1) = SoC(h) + |p|·Δt · η_c when charging,
with ηc = ηd = 0.92 (round-trip 85 %).
SoC is clipped to [10, 90] MWh — requested actions that would
overflow or underflow the battery are physically truncated.
The price curve is a stylised NYISO Zone J summer day: cheap overnight (~$22/MWh at 3 am), a morning shoulder peak near 9 am (~$100), a midday lull around 2 pm (~$38), and a large 4–7 pm evening peak (~$240). The structure rewards a two-cycle strategy — charge overnight, discharge morning, charge midday, discharge evening — which is the global optimum but lives in a fairly narrow region of the 24-D parameter space. Most algorithms find the one-cycle optimum first.
Score is total revenue in $/day, summed over 24 hourly settlements at the day-ahead LMP. Charging at negative power costs money; discharging at positive power earns it. Cycles counted as half the cumulative |throughput| / capacity. The naïve one-cycle preset earns ~$13,700; the hand-tuned two-cycle earns ~$15,000; DE on 1000 schedules typically lands $17,000+.
Day-ahead market only — real BESS optimisation also bids into real-time, frequency-regulation, and ancillary services markets, and respects degradation cost as a function of depth of cycling. The 24-D dispatch structure is preserved.
If your hyper-parameter searches are heating the Earth, drop this in Cursor or Claude:
Read https://raw.githubusercontent.com/microprediction/humpday/main/SKILL.md and create a project skill from it.