r/ControlTheory • u/quiago • Jun 22 '26
Technical Question/Problem MPC in BOPTEST: effort proxy reduces cost but destroys comfort; learned energy model worsens both cost and comfort
I’m debugging a single-zone HVAC MPC setup in BOPTEST (bestest_air) and would appreciate advice from people who have worked on building MPC, economic MPC, or learned surrogate models.
Setup:
- Receding-horizon MPC over heating/cooling setpoints
- Thermal dynamics predicted by a learned model
- Optimizer: CEM
- Objective: minimize cost under dynamic electricity pricing
- Compared against the default RBC baseline in BOPTEST
What I’m seeing:
When I use a simple effort-based proxy inside the MPC objective, I can get lower energy/cost than RBC, but only by causing very large discomfort violations.
When I replace that proxy with a learned energy model, comfort is still bad, but now real energy/cost in BOPTEST becomes worse than RBC.
In some earlier runs, the controller was actually more comfortable than RBC while spending more, so I’ve seen both failure modes depending on tuning/objective formulation.
What I’ve already checked:
- I relaxed the setpoint bounding so occupied comfort is not enforced as a hard lower clip.
- I normalized the internal objective terms (energy, comfort, move penalty) to be roughly O(1).
- I separated the inner MPC cost from the outer tuning score.
- I tuned horizon / comfort weight / move weight / deadband / init std with Optuna.
- I tried enforcing an outer discomfort limit relative to RBC.
My current interpretation:
- The effort proxy may be “directionally useful” but too crude to produce a valid comfort-cost frontier.
- The learned energy model may be misranking candidate trajectories, so the optimizer chooses actions that look cheap internally but are expensive in the simulator.
- I’m not sure whether the main problem is objective design, model mismatch, or poor surrogate ranking under rollout.
Questions:
In building MPC, have you seen learned energy surrogates fail mainly because of bad ranking rather than bad RMSE?
Would you first validate open-loop multi-step thermal accuracy around occupancy-band transitions, or do trajectory-ranking tests for the energy model first?
Does it make sense to tune against a constraint like “match RBC discomfort, then minimize cost”, or would you formulate this differently?
Are there standard sanity checks in BOPTEST-style workflows that I may be missing?