## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The dessert restaurant needs to decide how many batches of cupcakes and cakes to produce to maximize profit, given the constraints on oven and cooling rack time.

Let's define the decision variables:

* `cupcakes`: number of batches of cupcakes to produce
* `cakes`: number of batches of cakes to produce

The objective function is to maximize profit:

* Profit per batch of cupcakes: $10
* Profit per batch of cakes: $25

The constraints are:

* Oven time: 20 minutes per batch of cupcakes, 60 minutes per batch of cakes, and 9000 minutes available per month
* Cooling rack time: 60 minutes per batch of cupcakes, 120 minutes per batch of cakes, and 12000 minutes available per month

## Mathematical Formulation

The mathematical formulation of the problem is:

Maximize: 10 `cupcakes` + 25 `cakes`

Subject to:

* 20 `cupcakes` + 60 `cakes` <= 9000 (oven time constraint)
* 60 `cupcakes` + 120 `cakes` <= 12000 (cooling rack time constraint)
* `cupcakes` >= 0, `cakes` >= 0 (non-negativity constraints)

## Gurobi Code

```python
import gurobi

# Create a new Gurobi model
m = gurobi.Model()

# Define the decision variables
cupcakes = m.addVar(lb=0, name="cupcakes", vtype=gurobi.GRB.CONTINUOUS)
cakes = m.addVar(lb=0, name="cakes", vtype=gurobi.GRB.CONTINUOUS)

# Define the objective function
m.setObjective(10 * cupcakes + 25 * cakes, gurobi.GRB.MAXIMIZE)

# Define the constraints
m.addConstr(20 * cupcakes + 60 * cakes <= 9000, name="oven_time")
m.addConstr(60 * cupcakes + 120 * cakes <= 12000, name="cooling_rack_time")

# Optimize the model
m.optimize()

# Print the solution
if m.status == gurobi.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Cupcakes: {cupcakes.varValue:.2f}")
    print(f"Cakes: {cakes.varValue:.2f}")
    print(f"Max Profit: {m.objVal:.2f}")
else:
    print("No optimal solution found.")
```

This code defines the decision variables, objective function, and constraints, and then solves the model using Gurobi's optimization algorithm. If an optimal solution is found, it prints the values of the decision variables and the maximum profit. Otherwise, it indicates that no optimal solution was found.