Step 8: Run the optimization model
When you’ve completed the configuration for the optimization model, click Run to run it. The solver processes your optimization model and returns the solution. There are three possible outcomes:
An optimal solution is found.
The model is infeasible, meaning that it cannot be solved in its current state. This is usually due to conflicting constraints.
The model is unbounded, meaning that one or more decision variables lacks a constraint, so the “optimal” solution is infinite. Usually this occurs with a maximization problem - minimization is usually bounded at zero because the values must be non-negative.
The solution is written back to the same data pool where the Optimization Engine got your objects from. This is the OCPM Data Pool, or if you have multiple data pools enabled, it’s the data pool where you’re working with objects and events.
Each decision variable gets an output table in the data pool with a row for each solution, named
MILP_[decision variable name]
.If you enabled debug mode to write the data sources as tables back to the data pool where they were drawn from, each data source gets an input table in the data pool named
MILP_Input_[data source name]
.
To use an output or input table in a Studio app, you’ll need to create a dedicated object type to represent the table. The output and input tables are written to the global scope, so you can’t use them in objects that you created for your source system data, as it’ll have a different data connection. Instead, create a distinct object and add it into the perspective, relating it to a suitable leading object. Creating custom object types and custom event types explains how.