Debugging an Optimization Problem

Overview

This example will illustrate a few tools that can help debugging an optimization problem. For example, it will demonstrate how to test an optimization problem by only solving for a fixed number of time steps.

A Basic Optimization Problem

For this example, the model is kept very basic. We consider a single reservoir with a few target and optimization goals. The optimization problem is given below.

class SingleReservoir(
    GoalProgrammingMixin,
    CSVMixin,
    ModelicaMixin,
    CollocatedIntegratedOptimizationProblem,
):
    """
    An optimization problem involving a single reservoir.
    """

    only_check_initial_values = False

    def times(self, variable=None):
        times = super().times(variable)
        if self.only_check_initial_values:
            times = times[:1]
        return times

    def path_constraints(self, ensemble_member):
        constraints = super().path_constraints(ensemble_member)
        constraints.append((self.state("Q_release"), 0, 1.5))
        return constraints

    def goals(self):
        return [MinimizeQpumpGoal()]

    def path_goals(self):
        return [VolumeRangeGoal(), MinimizeChangeInQpumpGoal()]

Optimizing for a given number of time steps

By overwriting the method times, we can control the times for which the problem is optimized. In this case, we optimize for all times unless the class attribute only_check_initial_values is set to True. Optimizing for only the initial time can be useful to check for infeasibilities due to incompatible initial conditions.