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.