optimization.base_optimizer module

Base optimizer: minimize cost subject to import <= contracted_power.

Supports PV production (free solar) and BESS (battery storage) to reduce grid import costs. The power balance is:

grid_import + pv_production + Σ bess_discharge

= Σ charger_power + Σ bess_charge + pv_export

Performance-tuned for 10+ vessel fleets:
  • Tight big-M bounds (energy_req, not battery_capacity)

  • SOS1 sets on departure slots for better branching

  • Strong symmetry breaking across all delay slots

  • MIP warm-start with greedy on-time schedule

  • Solver parameter tuning (time limit, gap tolerance, emphasis)

class optimization.base_optimizer.BaseOptimizationResult(status: str, charger_schedules: Dict[str, List[Tuple[datetime, float]]], boat_schedules: Dict[str, List[Tuple[datetime, float]]], peak_power_kw: float, total_energy_kwh: float, total_cost: float)[source]

Bases: object

Result of a daily optimization run.

boat_schedules: Dict[str, List[Tuple[datetime, float]]]
charger_schedules: Dict[str, List[Tuple[datetime, float]]]
peak_power_kw: float
status: str
total_cost: float
total_energy_kwh: float
class optimization.base_optimizer.BaseOptimizer(port: Port, db_manager: DatabaseManager, timestep_seconds: int = 900, boat_charger_assignments: Dict[str, int] = None, trip_schedule: tuple = ((9, 0), (14, 1)), max_slack_timesteps: int = 8, deadline_decay_factor: float = 0.5, bess_end_soc_penalty: float = 0.5, time_limit_seconds: int = 120, mip_gap: float = 0.01)[source]

Bases: object

Minimize cost with grid import constrained to be <= contracted_power.

optimize_daily_schedule(forecast_date: datetime, energy_forecasts: List[EnergyForecast]) BaseOptimizationResult[source]
save_schedules_to_db(result: BaseOptimizationResult) None[source]